我有一个数据模型,其中包含一个UIImages数组属性,以及一个imageURL数组属性(代表相同的图像)。
在加载某个视图后,我使用 SDWebImage 在URLS中填充滚动视图,这看起来不错。
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...
}
我的问题是,我怎么能在不锁定UI的情况下将这些UIIamges加载到我的数据模型(self.project.images)中。我假设它是某种dispatch_async,但我无法弄清楚在哪里调用它。
我有两个属性,因为有些图像来自网络资源,有些来自本地设备/摄像头。
一种可能的解决方案是,当我最初使用url异步加载数据模型时,继续加载当时的UIImages,但似乎是使用了大块内存,可能不是需要。由于我正在加载多达20个项目,所有项目都包含图像数组。
答案 0 :(得分: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];
});