我有一个应用程序,其中用户操作尝试连接到在线资源。连接过程由第三方SDK 完成,成功或失败异步反馈。这由我配置为以任何一种方式发布通知的 appDelegate 处理。(即 Dropbox 风格)。
下面,假设失败,UIAlertView被调用的次数与执行操作的次数一样多。也就是如果我反复测试连接失败了,第一次block被调用一次,第二次block被调用两次,第3次被调用3次等等。就好像block操作没有被取消一样或从队列中删除。
if (!opQ) {
opQ = [[NSOperationQueue alloc] init];
}
[[NSNotificationCenter defaultCenter] addObserverForName:LINK_NOTIFICATION_FAILURE object:nil queue:opQ usingBlock:^(NSNotification *aNotification) {
dispatch_async(dispatch_get_main_queue(),
^{
[[[UIAlertView alloc] initWithTitle:@"Network_Account_Not_Linked" message:@"Your_attempt_to_link_your_account_ended_unsuccessfully"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
[[NSNotificationCenter defaultCenter] removeObserver:self];
});
}];
问题似乎与addObserverForName:object:queue:usingBlock: 有关。我使用addObserver:selector:name:object:进行了测试,效果很好(每个通知执行一个选择器)。使用块更方便,使代码更具可读性并允许访问局部变量,这就是我的动机。
我在 NSBlockOperation 线程和 dispatch_async 中尝试了[opQ cancelAllOperations] (根据调试器,此时opQ是“超出范围”)。此外,使用[NSOperationQueue mainQueue]并获得类似的失败结果。此外,我还尝试在注册通知之前从一个新的 opQ 开始...... nada。
为什么会发生多个呼叫?有没有更好的使用块的方法?