我有一個註冊的回調處理程序,用於偵聽iOS通訊簿中的更改。由於一些奇怪的原因(已提交錯誤),當應用程序從後臺返回時,有時會多次調用此回調函數。我希望我的回調處理程序只運行一次邏輯,即使在多次調用回調的情況下也是如此。這是我如何註冊回調:GCD和回調 - 併發問題
ABAddressBookRegisterExternalChangeCallback(address_book, adressBookChanged, self);
這是我如何構造我的回調處理程序採取GCD的優勢來處理這個問題。不幸的是,它不工作,和GCD並不妨礙內部邏輯被調用兩次......
void adressBookChanged(ABAddressBookRef ab, CFDictionaryRef info, void
*context)
{
NSLog(@"** IN addressBookChanged callback!");
ABAddressBookUnregisterExternalChangeCallback (ab, adressBookChanged, context);
__block BOOL fireOnce = FALSE;
dispatch_queue_t queue;
queue = dispatch_queue_create("com.myapp.abcallback", NULL);
dispatch_async(queue, ^{
if (fireOnce == FALSE) {
fireOnce = TRUE;
dispatch_queue_t queueInternal;
queueInternal = dispatch_queue_create("com.myapp.abcallbackInternal", NULL);
dispatch_async (queueInternal, ^{
NSLog(@"do internal logic");
});
dispatch_release(queueInternal);
}
});
dispatch_release(queue);
}
我敢肯定此代碼用於接收多個通知,因此有回調有什麼不同?他們是否自動產生不同的線程,使fireOnce值每次都是FALSE?我應該如何編寫此代碼以防止多次回調不止一次地調用內部邏輯?我想我可以使用鎖和/或同步塊來實現這一點,但是GCD似乎是一種更簡單的方法來實現這一點。
您是否已經提及多次提交回調的問題? –
9301976.之前由於「信息不足」而關閉,這基本上意味着他們要求一個樣本項目來重現問題,這不是我可以隨意複製的東西......它發生在一些Exchange忽視這些警報。 –
好的,我可能會安排併發送示例應用程序,因爲每次運行時都有錯誤。謝謝! –