Асинхронно загружать UIImage в мою модель данных?

У меня есть модель данных, которая включает в себя свойство, которое является массивом UIImages, а также свойство, которое является массивом imageURL (представляющих те же изображения).

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

for (NSURL *url in self.project.imageURLs) {
    UIImageView *imageView = [[UIImageView alloc]init];
    [imageView setImageWithURL:[NSURL URLWithString:urlString] placeholderImage:[UIImage imageNamed:@"loading"] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [imageView setContentMode:UIViewContentModeScaleAspectFit];
    [self.scrollview addSubview:imageView];
    ...some other frame calculations...
}

Мой вопрос заключается в том, как я мог бы одновременно загрузить эти UIIamges в мою модель данных (self.project.images) без блокировки пользовательского интерфейса. Я предполагаю, что это своего рода dispatch_async, но я не могу понять, где это вызвать.

У меня есть оба свойства, потому что некоторые изображения поступают из веб-источника, а некоторые с локального устройства / камеры.

Одним из возможных решений является то, что когда я асинхронно загружаю модель данных изначально с помощью URL-адресов, можно продолжать загружать UIImages в то время, но, похоже, используется большой кусок памяти, который может не понадобиться. Так как я загружаю до 20 проектов, все с массивами изображений.

1 ответ

В Swift 4.2: используйте этот способ

  DispatchQueue.main.async {
        // loading data, adding to an array, setting an image to UIImageView
    }

Версия для управления памятью:

  DispatchQueue.main.async {[weak weakSelf = self] in
        // loading data, adding to an array, setting an image to UIImageView
        // use weakSelf to avoid a memory leak: weakSelf.project.images ...
        // best way is to create a method in your ViewController – self.updateImage(), and call in this dispatch
    }

версия objC:

__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
     // use weakSelf here to avoid memory leaking like this:
     // [weakSelf updateImageView: indexOfImage];
});
Другие вопросы по тегам