iOS:[UIApplication schedulelocalnotification]和相关的本地通知操作方法线程安全吗?

时间:2012-12-17 08:16:50

标签: ios

我的应用程序有时需要安排近64个本地通知,这将阻止我的主要线程在iPhone4上进行近1次借调。 我想在一个单独的线程上执行此操作,这些本地通知是否操纵UIApplcation线程安全的方法?

2 个答案:

答案 0 :(得分:1)

不要这么认为,因为文档没有明确说明它和UIKit一般在大部分是不是线程安全的

但值得一试:D主线程只是dispatch_async;)

---也许可以选择单独安排它们并在

之间运行主循环

答案 1 :(得分:-1)

有两件事在起作用,线程安全并从后台线程调用UIKit。一些UIKit代码根本不喜欢从后台线程调用,如果你试图这样做会抛出异常(比如为UITextView设置一个新内容)。换句话说,代码中有类似的东西:

NSParameterAssert([NSThread isMainThread],
    @"This method must be called from the main thread.");

然后是线程安全,即。如果代码可以从后台线程调用,它可能仍然以一种可能导致错误的方式编写:

- (void) doA {
    for (id item in allItemsArray) {
        // do something
    }
}

- (void) doB {
    [allItemsArray addObject:@"foo"];
}

现在,如果一个线程在此期间调用-doA而另一个线程调用-doB,则您的应用会因异常而崩溃,因为您在枚举时更改了allItemsArray

所以第一个问题是如果可以在后台线程上调用通知方法。我会说他们可以。在这种情况下,您只需从后台队列安排所有通知:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    for (int i=0; i<64; i++) {
        // schedule notification
    }
});

除非您的应用程序的另一部分在此期间安排其他本地通知,否则您无需关心线程安全性。如果有,您可以创建一个单独的队列来序列化所有通知调用代码,或者您必须确保这些方法确实是线程安全的(在这种情况下,我没有提供权威资源)。