ios 7 Push Notification didReceiveRemoteNotification 方法在UI线程或单独线程上运行?

Posted

技术标签:

【中文标题】ios 7 Push Notification didReceiveRemoteNotification 方法在UI线程或单独线程上运行?【英文标题】:ios 7 Push Notification didReceiveRemoteNotification method run on UI thread or separate thread? 【发布时间】:2014-01-03 05:13:39 【问题描述】:

(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler 方法在 UI 线程或单独的后台线程上运行?因为我需要根据推送消息处理数据并使用Core Data存储在本地数据库表中。如果我用这种方法做Core Data操作,会不会干扰UI?

【问题讨论】:

只是想我会添加一条评论,说他很容易用断点进行测试。在方法中设置断点并发送触发通知以查看它在哪个线程上执行。 【参考方案1】:

每个应用程序委托方法仅在主线程上运行。尽量避免在那里做大任务。如果它的小任务不会干扰用户界面。

【讨论】:

我需要拆分一个字符串并将其存储为数组,然后使用核心数据将数组值存储到数据库中。如何在单独的线程中执行此操作? 我不熟悉核心数据,但你使用 Magical Record 来存储数据。也不需要单独的方法。【参考方案2】:

application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 是 UIKit 的一部分,它与 UI 线程相关联:

除非另有说明,否则只能从应用的主线程或主调度队列中使用 UIKit 类。此限制特别适用于从 UIResponder 派生的类或涉及以任何方式操纵应用程序用户界面的类。

UIKit 通过从 UI 线程调用此方法来遵循自己的规则。这使得使用其他 UIKey 方法变得容易,但您有责任确保您的方法快速返回。

【讨论】:

【参考方案3】:
(void)application:(UIApplication *)application 
               didReceiveRemoteNotification:(NSDictionary *)userInfo 
                    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler

方法在单独的后台线程上运行,因为当我们使用我们的应用程序时,应用程序会收到通知。所以这意味着这个方法在单独的后台线程上运行。

【讨论】:

以上是关于ios 7 Push Notification didReceiveRemoteNotification 方法在UI线程或单独线程上运行?的主要内容,如果未能解决你的问题,请参考以下文章

资料整理:基于node push server实现push notification

:自定义push notification sound

Flutter项目打包iOS出现 ITMS-90078 Missing Push Notification Entitlement问题

React Native Push Notification - react-native-fcm - ios无法构建

Appcelerator iOS Rich Push Notification 在通过 FCM 发送时不显示图像

Apple Push Notification Service - 更改通知消息的标题