在Block中使用Dispatch Async

时间:2014-10-20 01:05:10

标签: ios objective-c iphone parse-platform

当我使用块作为示例时,使用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原样?

2 个答案:

答案 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;
}