Skip to content

Commit b4660d5

Browse files
committed
fix(image): reuse iOS image view
1 parent 9e5f17a commit b4660d5

2 files changed

Lines changed: 25 additions & 17 deletions

File tree

.changeset/reuse-ios-image-view.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@granite-js/image": patch
3+
---
4+
5+
Reuse the iOS image provider view across source changes.

packages/image/ios/GraniteImageComponentView.mm

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ @interface GraniteImageComponentView : RCTViewComponentView <RCTGraniteImageView
4242

4343
@implementation GraniteImageComponentView {
4444
UIView *_containerView;
45+
UIView *_errorView;
4546
NSString *_currentUri;
4647
UIViewContentMode _currentContentMode;
4748
BOOL _needsInitialLoad;
@@ -198,11 +199,7 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
198199

199200
if (shouldReload) {
200201
if (_currentUri.length > 0) {
201-
// 다음 runloop으로 지연하여 _eventEmitter 세팅 후 실행
202-
__weak GraniteImageComponentView *weakSelf = self;
203-
dispatch_async(dispatch_get_main_queue(), ^{
204-
[weakSelf loadImageWithProvider];
205-
});
202+
[self loadImageWithProvider];
206203
} else {
207204
// URI가 비어있거나 nil인 경우 에러 발생
208205
[self showErrorViewWithMessage:@"No URI provided"];
@@ -259,10 +256,6 @@ - (void)emitOnLoadEnd
259256

260257
- (void)loadImageWithProvider
261258
{
262-
// Remove existing container view
263-
[_containerView removeFromSuperview];
264-
_containerView = nil;
265-
266259
id<GraniteImageProvidable> provider = [[GraniteImageRegistry shared] provider];
267260

268261
if (!provider) {
@@ -279,15 +272,21 @@ - (void)loadImageWithProvider
279272
return;
280273
}
281274

282-
// Emit load start event
275+
[_errorView removeFromSuperview];
276+
_errorView = nil;
277+
283278
[self emitOnLoadStart];
284279

285-
// Create new image view from provider
286-
UIView *imageView = [provider createImageView];
287-
imageView.frame = self.bounds;
288-
imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
289-
[self addSubview:imageView];
290-
_containerView = imageView;
280+
UIView *imageView = _containerView;
281+
if (!imageView) {
282+
imageView = [provider createImageView];
283+
imageView.frame = self.bounds;
284+
imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
285+
[self addSubview:imageView];
286+
_containerView = imageView;
287+
} else {
288+
[provider cancelLoadWith:imageView];
289+
}
291290

292291
// Check if provider supports extended loading with callbacks
293292
__weak GraniteImageComponentView *weakSelf = self;
@@ -353,6 +352,8 @@ - (void)loadImageWithProvider
353352

354353
- (void)showErrorViewWithMessage:(NSString *)message
355354
{
355+
[_errorView removeFromSuperview];
356+
356357
UIView *errorView = [[UIView alloc] initWithFrame:self.bounds];
357358
errorView.backgroundColor = [UIColor redColor];
358359
errorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
@@ -374,7 +375,7 @@ - (void)showErrorViewWithMessage:(NSString *)message
374375
]];
375376

376377
[self addSubview:errorView];
377-
_containerView = errorView;
378+
_errorView = errorView;
378379
}
379380

380381
- (void)prepareForRecycle
@@ -388,6 +389,8 @@ - (void)prepareForRecycle
388389

389390
[_containerView removeFromSuperview];
390391
_containerView = nil;
392+
[_errorView removeFromSuperview];
393+
_errorView = nil;
391394
_currentUri = nil;
392395
}
393396

0 commit comments

Comments
 (0)