我發現,正如我在編寫圖像時所預測的那樣,我的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