dispatch_async без эффекта
У меня есть несколько кнопок, и я хочу, чтобы для каждой кнопки было изображение из URL. Что я пытался сделать, и это не работает (кнопки без изображения). Если я пытаюсь сделать то же самое без отправки, это работает, но это занимает время. Где я не прав?
UIImageView *imageView = [[UIImageView alloc] init];
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
NSString *imageURL = pictureUrl[i];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]];
imageView.image = [UIImage imageWithData:imageData];
[bt setBackgroundImage:imageView.image forState:UIControlStateNormal];
//
dispatch_async( dispatch_get_main_queue(), ^{
});
});
2 ответа
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
NSString *imageURL = pictureUrl[i];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]];
UIImage *image = [UIImage imageWithData:imageData];
dispatch_async(dispatch_get_main_queue(), ^{
[bt setBackgroundImage:image forState:UIControlStateNormal];
});
});
Вы делаете все в фоновом режиме, а затем ничего не делаете в основном потоке. Вместо этого загрузите данные в фоновом режиме и работайте с пользовательским интерфейсом в главном потоке. Также нет необходимости иметь imageView
Вы сообщаете, что
imageData
являетсяnil
:NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]
Если это так, вы должны сначала проверить, если
NSURL
объектnil
или нет:NSURL *URL = [NSURL URLWithString:imageURL]; NSLog(@"URL = %@", URL); NSData *imageData = [NSData dataWithContentsOfURL:URL];
URL-адрес может выглядеть хорошо, но только если посмотреть на
NSURL
Значение вы подтвердите это.Если, как вы, кажется, настаиваете, URL-адрес в порядке (и вы подтвердили
NSURL
не являетсяnil
), ноNSData
все еще подходитnil
, тогда вы должны использовать другой механизм поиска, который возвращаетNSError
объясняя, почему это не удалось. Например, вы можете заменить этоdispatch_async
чтобы он фон с призывом кsendAsynchronousRequest
и еслиNSData
былоnil
затем посмотрите наNSError
объект.Предположительно нет необходимости говорить об этом, но убедитесь, что все обновления элементов управления пользовательского интерфейса (например, представление изображения) отправляются обратно в основную очередь.