@@ -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