iphone - 创建自定义 NSRunLoop

标签 iphone cocoa-touch

我开始将 RunLoop 理解为类似于 Java 中的事件队列。我现在尝试做的 Wgat,只是为了更好地理解,是在运行自己的 RunLoop 的应用程序中创建一个后台线程。我在示例 ViewController 中得到了这样的结果,然后陷入困境:

@implementation iPhoneRunLoopsViewController

-(void) workerMain
{
  [[NSRunLoop currentRunLoop] run];
}

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
{
  worker = [[NSThread alloc] initWithTarget:self selector:@selector(workerMain) object:nil];
  [worker start];
}

- (IBAction)go:(id)sender {

}

根据苹果文档:

Before you run a run loop on a secondary thread, you must add at least one input source or timer to it. If a run loop does not have any sources to monitor, it exits immediately when you try to run it. For examples of how to add sources to a run loop, see “Configuring Run Loop Sources.”

我正在尝试在我的 init 方法中启动一个自定义线程,该线程将用于任意工作。我想将“go”方法中的工作发送到这个任意线程中。我不知道如何将工作从类似 go 方法(将连接到 Go 按钮)发送到 RunLoop 中。假设我想从 1 数到 10,并在该辅助线程的每个步骤之间有一个小的延迟。我会在 go 方法中添加代码,以使用辅助线程的 RunLoop 来安排工作,执行类似 PerformOnThread... 我是否在启动时缓存对此运行循环的引用?如何启动运行循环并让它等待工作? (如何使用自定义输入源配置运行循环?)显然,如果运行循环没有计时器或输入源,则运行方法只会返回。我已经看过讨论如何使用 CF 函数创建自定义源的文档,但我没有看到所有这些如何插入在一起的清晰示例。有人可以帮忙吗?

最佳答案

要继续,请调用 CFRunLoopRun$ 或连接 CF 或 NS 计时器

如果您想缓存运行循环(对于连续调用,您可以)。也许最好从子类化 NSThread (你的工作变量)开始,并为其提供一些要做的事情,以及完成后要报告的一些内容(这就是你真正的多线程问题开始的地方)。因此,运行循环附加了一个计时器,一直工作到完成,如果计划继续,则休眠。作为一个概述,我希望这是有道理的。

Do I cache a reference to this run loop on startup?

如果您只需要从工作线程中获取它,那确实没有必要。

How do I start the run loop and make it wait for work?

您可以通过启动线程并从线程访问它来启动它。通过告诉它运行(即在模式下)或附加计时器来继续运行。

关于iphone - 创建自定义 NSRunLoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1753379/

相关文章:

objective-c - 有没有办法从应用程序本身到 'self-destruct'?

objective-c - NSMutableArray addObject 不添加对象,并且对象已分配

ios - 如何同时弹出模态视图和上一个导航 Controller View ?

iphone - 我将如何绘制到可变的内存位图?

ios - 是否需要将我的应用程序设置为 "universal"才能获得 AppStore 批准?

iphone - iOS 4 中的多任务感知应用程序和自定义 URL 方案

iphone - MKMap 不使用定义的纬度和经度

iphone - 在 iPhone 应用程序中更改 iPhone 4 用户的图像质量

ios - 嵌入在 UITextView 中的三列表

ios - 不重用单元格的 UICollectionView