【问题标题】:How to use NSRunLoop and performSelector?如何使用 NSRunLoop 和 performSelector?
【发布时间】:2015-07-29 21:37:10
【问题描述】:

我试图弄清楚 NSRunLoop 是如何工作的。 所以有一些延迟的任务,我想使用 NSRunLoop 在几秒钟内执行它们。我想手动创建 NSRunLoop 。我该怎么做?

NSRunLoop *loop = [NSRunLoop currentRunLoop];

//create delayed tasks
[object performSelector:NSSelectorFromString(@"firstMethod") withObject:firstArgument afterDelay:5.0];
[object performSelector:NSSelectorFromString(@"secondMethod") withObject:secondArgument afterDelay:3.0];

//and here I must run a loop 
while(flag&&[loop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

而且我还必须以某种方式停止这个循环。如您所见,我完全感到困惑,这里的许多 Apple 文档和主题对我没有帮助。

【问题讨论】:

  • 这是您自己创建的主题吗?你为什么要手动旋转运行循环?您发布的代码有什么问题?
  • @JoshCaswell,这是一个主线程。而且我已经读到不需要创建主线程的运行循环,但正如我所说,我想弄清楚它是如何工作的。至于代码。它在while 中进入无限循环,然后什么也没有发生。
  • 主运行循环自动创建和旋转。有时有理由自己旋转它,但这似乎不是。您的performSelector:... 调用将在您不接触运行循环的情况下生效。
  • @JoshCaswell 好的,但是程序的执行速度比预期的延迟任务快。那么如何让它等待performSelector呢?
  • firstMethodsecondMethod 调用太快了?

标签: objective-c nsrunloop


【解决方案1】:

致 Q 和 cmets:

当然,它们永远不会被执行。 -performSelector:… 附加到线程的当前运行循环。这个运行循环永远不会到达,因为你的程序卡在你的私有运行循环中。

此外,根本不可能将运行循环附加到线程:

您的应用程序不能创建或显式管理 NSRunLoop 对象。每个 NSThread 对象,包括应用程序的主线程,都有一个根据需要自动为其创建的 NSRunLoop 对象。如果需要访问当前线程的运行循环,请使用类方法 currentRunLoop。

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSRunLoop_Class/index.html

【讨论】:

  • 没有“私人”运行循环。正在旋转的循环线程的运行循环,它在默认模式下运行,这是performSelector:... 将在其中执行其参数方法的模式。
  • @JoshCaswell 哇,我真的读过+alloc-init,可能是因为上面的文字。我的错。我将删除我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多