当我使用块作为示例时,使用dispatch_async在主线程上调用UI更新会更好吗?
PFFile *image = (PFFile *)[currentUser objectForKey:@"image"];
[image getDataInBackgroundWithBlock:^(NSData *data, NSError *error){
if (error)
{
self.profileImage.image = [UIImage imageNamed:@"image"];
}
else
{
UIImage *userImage = [UIImage imageWithData:data];
self.profileImage.image = userImage;
}
}];
如果我把" self.profileImage.image = userImage;"会更好吗?在一个调度async中的那个else条件或者它是否重要,因为它是一个块,并被称为async原样?
答案 0 :(得分:0)
如果设置self.profileImage.image
导致您希望用户看到的UI立即发生更改,那么您应该在主队列上设置该属性。如果您只是设置与UI不直接相关的内部数据,那么您可以继续在后台队列上执行它。因此,如果要更新主队列上的配置文件图像,可以使用
dispatch_async(dispatch_get_main_queue(), ^(void){
self.profileImage.image = [UIImage imageWithData:data];
}
答案 1 :(得分:0)
您需要在主线程中执行图像加载操作。
self.profileImage.image = userImage;
上面的行是UI操作,因为它在一个块中,加载并使你的UI交互停止一段时间需要一些时间。
您只需要在主线程中调用此行:
PFFile *image = (PFFile *)[currentUser objectForKey:@"image"];
[image getDataInBackgroundWithBlock:^(NSData *data, NSError *error){
if (error)
{
self.profileImage.image = [UIImage imageNamed:@"image"];
}
else
{
[self performSelectorOnMainThread:@selector(loadImage:) withObject:data waitUntilDone:YES];
}
}];
- (void) loadImage:(NSData *)data {
UIImage *userImage = [UIImage imageWithData:data];
self.profileImage.image = userImage;
}