3

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

4

2 回答 2

1

不要这么认为,因为文档没有明确说明它,而且 UIKit 通常在很大程度上不是线程安全的

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

--- 也许可以选择单独安排它们并在两者之间运行主循环

于 2012-12-17T08:25:29.377 回答
-1

有两件事在起作用,线程安全和从后台线程调用 UIKit。一些 UIKit 代码根本不喜欢从后台线程调用,如果你尝试这样做会抛出异常(比如为 a 设置新内容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
    }
});

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

于 2012-12-17T08:26:33.707 回答