以下代码需要45秒才能完成。我要做的就是在启动时显示单个图像,而不是在用户返回第一个UI视图时重新加载。
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
dispatch_async(myQueue, ^{
// Perform long running process
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI
});
});
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSArray *image = @[@"https://dl.dropboxusercontent.com/u/60438364/main.jpg"];
dispatch_queue_t imageQueue = dispatch_queue_create("Image Queue",NULL);
for (NSString *urlString in image) {
dispatch_async(imageQueue, ^{
NSURL * imageURL = [NSURL URLWithString:@"https://dl.dropboxusercontent.com/u/60438364/main.jpg"];
NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
self.image.image = [UIImage imageWithData:imageData];
NSUInteger imageIndex = [image indexOfObject:urlString];
UIImageView *image = (UIImageView *)[self.view viewWithTag:imageIndex];
if (image) return;
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI
[image setImage:self.image.image];
});
});
}
}
答案 0 :(得分:2)
这可能是问题所在:
dispatch_async(imageQueue, ^{
NSURL * imageURL = [NSURL URLWithString:@"https://dl.dropboxusercontent.com/u/60438364/main.jpg"];
NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
self.image.image = [UIImage imageWithData:imageData];
如果您的界面中有self.image
,那就是问题 - 您正在尝试在后台线程上更新界面。这是非法的。即使它不在界面中,您也在后台线程上更新self
,这可能同样有问题。
如果这不是问题,那肯定是:
dispatch_async(imageQueue, ^{
// ...
UIImageView *image = (UIImageView *)[self.view viewWithTag:imageIndex];
self.view
肯定是您的界面。所以你肯定是在后台线程上与你的界面交谈。
简而言之,您的代码不是线程安全的。