performSelectorInBackground,完成后通知其他viewcontroller

时间:2010-01-20 17:55:03

标签: iphone multithreading

我有一种用于在用户点击“保存”时保存图像的方法。 我使用performSelectorInBackground来保存图像,弹出viewcontroller并显示前一个viewcontroller。

我希望表格(在previousUIViewController上)在完成图像处理时重新加载它的数据。

我该怎么做?

这样调用save方法:

[self performSelectorInBackground:@selector(saveImage) withObject:nil];
[self.navigationController popViewControllerAnimated:YES];

3 个答案:

答案 0 :(得分:9)

saveImage方法中,在完成保存图像之后和从方法返回之前发布通知。像这样:

// post notification
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageSaved" object:nil];

在处理表的控制器中,实现

- (void) imageSaved:(NSNotification *)notification{

    [self.tableView reloadData];

}

并在其viewDidLoad方法中添加以下代码以注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                selector:@selector(imageSaved:)
                                                 name:@"ImageSaved" object:nil];

最后,在dealloc方法中添加

取消注册
[[NSNotificationCenter defaultCenter] removeObserver:self];

答案 1 :(得分:2)

我认为要走的路是在saveImage例程结束时调用方法。也许像是

[self performSelectorInBackground:@selector(saveImage) withObject:previousView];

如果您想保持saveImage不可知,请使用您之前的View可以使用的回调创建一个协议。

@protocol processingFinishedDelegate
-(void)processingFinished;
@end

所以在saveImage结束时你会有:

[(id<processingFinishedDelegate>)object processingFinished];

当然你的previousView类接口应该处理委托。

答案 2 :(得分:0)

我在使用此方法更新UITextView时遇到“unforgiven”建议的问题。我尝试了几种不同的方法,但都失败了......我也尝试了通知+观察者,但没有成功......为什么会这样?它在UILabel上运行正常,但没有UITextView,并显示以下消息:

尝试从主线程或Web线程以外的线程获取Web锁定。这可能是从辅助线程调用UIKit的结果。现在崩溃......