gpt4 book ai didi

ios - NSRunLoop 的 runMode :beforeDate: - the correct approach for setting the "beforeDate"

转载 作者:行者123 更新时间:2023-11-29 11:06:40 25 4
gpt4 key购买 nike

我对 NSRunLoop 的 runMode:beforeDate 方法的正确使用有疑问。

我有一个辅助的后台线程,用于处理收到的委托(delegate)消息。

基本上,我有需要在后台线程上执行的进程密集型逻辑。

所以,我有 2 个对象,ObjectAAnotherObjectB

ObjectA 初始化 AnotherObjectB 并告诉 AnotherObjectB 开始做它的事情。 AnotherObjectB 异步工作,因此 ObjectA 充当 AnotherObjectB 的委托(delegate)。现在,需要在委托(delegate)消息中执行的代码需要在后台线程上完成。所以,对于 ObjectA,我创建了一个 NSRunLoop,并做了类似这样的事情来设置运行循环:

do {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (aCondition);

aCondition 设置在“完成委托(delegate)消息”中的某处。

我收到了我所有的委托(delegate)消息,它们正在该后台线程上进行处理。

我的问题是:这是正确的方法吗?

我问这个的原因是因为 [NSDate distantFuture] 是一个跨越几个世纪的日期。所以基本上,runLoop 不会超时,直到“distantFuture”——到那时我绝对不会使用我的 Mac 或这个版本的 iOS。 >_<

但是,我不希望运行循环运行那么长时间。我希望运行循环在我的最后一个委托(delegate)消息被调用后立即完成,以便它可以正确退出。

此外,我知道我可以设置重复计时器,间隔更短,但这不是最有效的方法,因为它类似于轮询。相反,我希望线程仅在委托(delegate)消息到达时工作,并在没有消息时休眠。那么,我采取的方法是正确的方法,还是有其他方法可以做到这一点。我阅读了文档和指南,并根据我从阅读中理解的内容进行了设置。

但是,如果不确定,最好向这个很棒的社区征求意见和确认。

因此,提前感谢您的所有帮助!

干杯!

最佳答案

密码是in the docs :

If you want the run loop to terminate, you shouldn't use this method. Instead, use one of the other run methods and also check other arbitrary conditions of your own, in a loop. A simple example would be:

BOOL shouldKeepRunning = YES;        // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

where shouldKeepRunning is set to NO somewhere else in the program.

在你最后一个“消息”之后,取消设置 shouldKeepRunning(在与运行循环相同的线程上!)它应该完成。这里的关键思想是您需要向运行循环发送一个事件,以便它知道停止。

(另请注意,NSRunLoop 不是线程安全的;我认为您应该使用 -[NSObject performSelector:onThread:...]。)

或者,如果它适合您的目的,使用后台调度队列/NOperationQueue(但请注意,执行此操作的代码不应触及运行循环;诸如从调度队列/NSOperationQueue 工作线程启动 NSURLConnection 之类的事情将可能会导致问题)。

关于ios - NSRunLoop 的 runMode :beforeDate: - the correct approach for setting the "beforeDate",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13314135/

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