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

  1. Вы сообщаете, что 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 Значение вы подтвердите это.

  2. Если, как вы, кажется, настаиваете, URL-адрес в порядке (и вы подтвердили NSURL не является nil), но NSData все еще подходит nil, тогда вы должны использовать другой механизм поиска, который возвращает NSError объясняя, почему это не удалось. Например, вы можете заменить это dispatch_async чтобы он фон с призывом к sendAsynchronousRequest и если NSData было nilзатем посмотрите на NSError объект.

  3. Предположительно нет необходимости говорить об этом, но убедитесь, что все обновления элементов управления пользовательского интерфейса (например, представление изображения) отправляются обратно в основную очередь.

Другие вопросы по тегам