1

有没有办法在不延迟任何当前完成的代码的情况下触发 NSNotification(这可能会触发大量工作)?

具体来说,我有一个 UIPanGestureRecognizer,它允许用户浏览月份、1 月、2 月等。一旦用户抬起手指(识别器状态更改 UIGestureRecognizerStateEnded),就会运行一些清理代码,包括一些 UI(调整框架等) ),而且——重要的是——在选定月份触发的 NSNotification 。

这在模拟器中运行顺利,但在我的 iPhone 4 上运行时,性能很差(即当我抬起手指时,UI 锁定 +1.5 秒)。如果我删除通知,则性能恢复良好。请注意,这些通知正在整个应用程序中发送(同步基于月份的日历、基于周的日历和事件列表)并且到目前为止没有显示性能问题。只有在这一点上,当它们与手势识别器一起使用时,性能才会成为问题。

4

3 回答 3

1

首先,你应该分析一下到底是什么在花时间。1.5 秒的延迟,无论是现在还是延迟到未来一段时间,都是很长的时间。

当您发布通知时,它会立即广播并处理。performSelector:withObject:afterDelay:您可以做的最好的事情是使用 GCD 或(adelay为 0)在 runloop 的下一次迭代中发布通知。

于 2013-09-30T19:29:12.690 回答
1

使用 NSNotificationQueue。这是最简单的方法。

于 2013-10-01T02:08:32.703 回答
0

将 dispatch_async() 与 performSelectorOnMainThread:withObject:waitUntilDone: 一起使用是“在不延迟当前操作的情况下触发 NSNotification”的一种解决方案。NSNotificationQueue 可能是另一种解决方案,但我没有发现它和 dispatch_async 一样有效。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    [self performSelectorOnMainThread:@selector(performNotification:) withObject:someObject waitUntilDone:NO];
});

- (void)performNotification:(SomeClass*)someObject
{
    [[NSNotificationCenter defaultCenter] postNotificationName:MyNotificationName object:someObject];
}

(通过这篇SO 文章

于 2013-09-30T19:44:46.817 回答