0

Я хочу, чтобы сохранить UIImages в NSMutableDictionary, который является свойством в методе блока,доступ NSMutableDictionary свойство в блоке

__block UIImage *headImage = [[UIImage alloc] init]; 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    headImage = [self getImageFromURL:status.user.profile_image_url]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [headImageView setImage:headImage]; 
     [[self contentView] addSubview:headImageView]; 
    }); 
}); 

При отладке getImageFromURL я нашел каждый раз, когда iconDict пуста, и метод возвращает before setObject: forKey.

-(UIImage *) getImageFromURL:(NSString *)imageUrl { 

UIImage * image = [[UIImage alloc] init]; 

if(iconDict) 
{ 
    image = [_iconDict objectForKey:imageUrl]; 

    if (image) { 
     return image; 
    } 
} else { 
    _iconDict = [NSMutableDictionary dictionaryWithCapacity:3]; 
} 

image = [self loadImage:imageUrl]; 
[_iconDict setObject:image forKey:imageUrl]; 

return image; 

}

Что беспокоиться по этому поводу?

+0

Почему выделяют 'headImage', а затем назначить его в блоке? – trojanfoe

+0

Поскольку изображения, возможно, не были загружены, они получат данные по URL-адресам изображений. Это более плавно обрабатывать в другом потоке. –

ответ

0

Я бы сказал, что вам нужно изменить семантику вашего кода. Нет причины хранить экземпляр UIImage в вызывающей функции, поэтому просто сделайте так, чтобы getImageFromURL: просто возвращал статус логического успеха. Если это YES затем получить изображения из _iconDict:

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    if ([self getImageFromURL:status.user.profile_image_url]) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [headImageView setImage:_iconDict[status.user.profile_image_url]]; 
      [[self contentView] addSubview:headImageView]; 
     }); 
    } 
}); 

... 

- (BOOL)getImageFromURL:(NSString *)imageUrl { 
    UIImage *image = [_iconDict objectForKey:imageUrl]; 
    if (!image) { 
     image = [self loadImage:imageUrl]; 
     if (image) { 
      if (!_iconDict) 
       _iconDict = [NSMutableDictionary dictionaryWithCapacity:3];      
      _iconDict[imageUrl] = image; 
     } 
    } 
    return image != nil; 
} 
Смежные вопросы