处理上一个

时间:2015-12-01 03:57:37

标签: ios objective-c notifications

我搜索了一段时间并没有看到任何相关的答案,所以我必须打开一个新问题。请指出它是否重复。

当用户触摸iOS通知操作时,会向应用代理发送以下方法:

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler

根据文档,当应用程序完成处理操作时,应调用completionHandler。因此,如果进程是异步进程,那么委托方法可能是这样的:

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(5);
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"completed with notification %@", userinfo);
            completionHandler();
        });
    });
}

此处,全局队列休眠5秒,以模拟操作处理。

通过上述设置,我采取了以下步骤:

  1. 执行action1
  2. 执行action2 BEFORE action1的completionHandler被调用。
  3. 在action2的completionHandler被调用之后,执行action3
  4. 之后,我发现action3的completionHandler NEVER 被调用,这意味着action3 从不 dealed。

    我在iOS 9中发现了这个,不确定其他iOS版本。 这是为什么?我该怎么办才能修复它?感谢。

1 个答案:

答案 0 :(得分:1)

最后,我将completionHandler执行和异步执行代码放在这个配对API的中间:

- beginBackgroundTaskWithExpirationHandler:

- endBackgroundTask

确保可以在我的序列中调用completionHandler,并且当app运行到后台模式时不会挂起。

它有效。 ^ _ ^