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

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

【问题讨论】:

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

标签: ios objective-c ios7


【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 2019-03-09
      • 2011-04-21
      • 2012-11-06
      相关资源
      最近更新 更多