Асинхронно загружать 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];
});