我发现,正如我在编写图像时所预测的那样,我的UI在持续时间内被阻止,这是不可接受的。当我将图像写入文件时,我会发布NS通知,以便我可以完成与该完成相关的其他特定工作。原来的工作,但UI阻止代码:如何在使用Grand Central Dispatch时发布NSNotification?
-(void)saveImageToFile {
NSString *imagePath = [self photoFilePath];
BOOL jpgData = [UIImageJPEGRepresentation([[self captureManager] stillImage], 0.5) writeToFile:imagePath atomically:YES];
if (jpgData) {
[[NSNotificationCenter defaultCenter] postNotificationName:kImageSavedSuccessfully object:self];
}
为了避免阻塞UI我已经把将writeToFile:进入大中央调度队列所以它运行的并发线程。但是当写入完成并且线程完成时,我想发布一个NSNotification。我不能在这里显示代码,因为它在后台线程中。但是,这是我要完成的功能,实现这不是可行代码:
-(void)saveImageToFile {
NSString *imagePath = [self photoFilePath];
// execute save to disk as a background thread
dispatch_queue_t myQueue = dispatch_queue_create("com.wilddogapps.myqueue", 0);
dispatch_async(myQueue, ^{
BOOL jpgData = [UIImageJPEGRepresentation([[self captureManager] stillImage], 0.5) writeToFile:imagePath atomically:YES];
dispatch_async(dispatch_get_main_queue(), ^{
if (jpgData) {
[[NSNotificationCenter defaultCenter] postNotificationName:kImageSavedSuccessfully object:self];
}
});
});
}
这里正确的机制来发布该通知,以获得我想要的功能是什么?
我认为您的第一个选项的简单性非常干净清晰。我不知道performSelectorOnMainThread :.指出子线程并在主循环中执行工作是一种很好的方式。很好。谢谢。 – Ric
原始问题中的代码不起作用吗?它看起来应该像预期的那样工作,因为您正在将通知分派到传递给'myQueue'的块末尾的主队列。我更喜欢使用'performSelector:onMainThread:'这个模式,因为你没有编写一个单独的方法来处理你的通知。清洁代码IMO。 – sho
所以我现在困惑与所有选项。 NSNotificationCenter,GrandCentralDispatch-Blocks和performSelectorOnMainThread。我用NSOperation&Queue使用了pSOMT,但从来没有使用前两个。有人能解释一下这些差异或优点吗? – marciokoko