gpt4 book ai didi

ios4 - GCD和回调-并发问题

转载 作者:行者123 更新时间:2023-12-02 16:15:57 25 4
gpt4 key购买 nike

我注册了一个回调处理程序,用于监听 iOS 地址簿中的更改。由于某些奇怪的原因(已提交错误),当应用程序从后台返回时,有时会多次调用此回调。我希望我的回调处理程序只运行一次逻辑,即使回调被多次调用。这是我注册回调的方式:

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?我应该如何编写这段代码以防止多个回调多次调用内部逻辑?我想我可以使用锁和/或同步块(synchronized block)来实现这一点,但 GCD 似乎是实现这一点的更干净的方法。

最佳答案

多次回拨的原因是电话簿iCloud后台同步的原因。通常,如果您有多个设备登录同一个 iCloud 帐户,同步将传播到所有设备,并回显到发生更改的测试设备,从而导致回调被多次调用。

顺便说一句,使用计时器来限制重复调用并不能完全解决这个问题,因为根据您的网络状况,您不知道何时调用下一个回调。您应该编写逻辑来处理这些重复的调用。

关于ios4 - GCD和回调-并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7116956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com