gpt4 book ai didi

objective-c - 使用 NSNotification 中断循环

转载 作者:行者123 更新时间:2023-12-03 16:23:34 25 4
gpt4 key购买 nike

我有一个类,其中包含一个带有循环的方法。如果发生某个事件(例如按下按钮),我需要能够打破循环。

我使用 NSNotificationCenter 在按下按钮时通知包含循环的类。

但是,如果我在执行循环时按下按钮,则会在循环完成后发出通知,而不是中断循环。

我猜这是因为它在同一个线程中运行。

那么如何让 NSNotificationCenter 在后台/不同线程中运行?这可能吗?或者有更好的方法吗?

最佳答案

这不仅仅是通知中心。

I have a class containing a method with a loop. I need to be able to break the loop if a certain event (e.g. button press) occurs.

该按钮按下的事件进入主线程。如果您的循环在主线程上运行,则在循环完成之前按下按钮本身不会得到处理。相对于您的应用程序实际处理的按钮按下,通知会立即发布。

或者,以列表形式:

  1. 用户按下按钮。
  2. 您的循环耗尽了要做的事情并返回。
  3. 按下按钮后到达您的应用程序,并由按钮将其转变为操作消息。
  4. 您发布通知。
  5. 您会收到通知。

您看到的延迟介于步骤 1 和 2 之间;第 4 步在第 3 步之后立即发生。

本地(非分布式)NSNotificationCenter 上的通知将在您发布通知的线程上分派(dispatch),因此从操作方法发布通知意味着它将在主线程上分派(dispatch)。这是正常现象,没问题。

循环(而不是通知)移至后台线程、调度队列或操作队列。如果您使用操作队列,则可能根本不需要通知,因为您可以告诉操作队列取消所有挂起的操作。 (您的操作需要在任何适当的时间检查它们是否已被取消;对于 reasons previously discussed ,随机终止线程/操作是一个坏主意。)

后台线程、 block 和操作可以在需要时与主线程通信(例如,更新 UI)。要通过主线程的运行循环发送消息,请使用performSelectorOnMainThread:withObject:waitUntilDone:。要在主线程上调度 block ,请使用dispatch_async和dispatch_get_main_queue。要在主线程上安排操作,请将其添加到[NSOperationQueue mainQueue]

有关更多信息,请阅读 Concurrency Programming GuideNotification Programming Topics .

关于objective-c - 使用 NSNotification 中断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7915755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com