我的应用程序有时需要安排近 64 个本地通知,这将在 iPhone4 上阻塞我的主线程近 1 秒。我想在一个单独的线程上执行此操作,这些线程的本地通知操作方法是否UIApplcation
安全?
问问题
773 次
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 回答