NSRunLoop做什么?

onm*_*133 6 port nsthread nsrunloop ios

我读到很多帖子NSRunLoop,像这个,这个,这个.但无法弄清楚究竟NSRunLoop做了什么

我通常看到的是一个工人线程

wthread = [[NSThread alloc] initWithTarget:self selector:@selector(threadProc) object:nil];  
[wthread start];
Run Code Online (Sandbox Code Playgroud)

里面有一个NSRunLoop

- (void)threadProc 
{
    NSAutoreleasePool* pool1 = [[NSAutoreleasePool alloc] init];
    BOOL isStopped = NO;
    NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

    while (!isStopped)
    {
        {
            NSAutoreleasePool* pool2 = [[NSAutoreleasePool alloc] init];
            [runloop runMode:NSDefaultRunLoopMode
                                      beforeDate:[NSDate distantFuture]];

            [pool2 release];
        }
    }

    [pool1 release];
}
Run Code Online (Sandbox Code Playgroud)

主线程将一些工作传递给了这个wthread

[self performSelector:@selector(someWork:) onThread:wthread withObject:nil waitUntilDone:NO];
Run Code Online (Sandbox Code Playgroud)

在将工作从主线程传递到工作线程方面,我看到很多人这样做.为什么需要NSRunLoop?它有什么作用 ?

我读了NSRunLoop用于管理事件,为什么会出现什么叫除外runMode里面threadProc

Flu*_*imp 5

您显示的示例是可可惯用法,用于创建在方法-threadProc退出后将继续运行的线程。为什么?

因为:

  • NSRunLoop您创建的实例至少具有一个输入源([NSMachPort port]
  • 您已使用以下命令明确启动了运行循环 runMode:beforeDate

如果不添加输入源并显式启动运行循环,线程将终止。

顺便说一句,尽管运行循环对于管理事件和某些异步任务仍然至关重要,但如今,我不认为NSThread这是在Cocoa应用程序中设计大多数异步工作的默认方式。GCD是封装后台工作的一种更为简洁的方法。

编辑

将工作提交到GCD中的串行队列:

@interface Foo : NSObject
@end

@implementation Foo {
    dispatch_queue_t _someWorkerQueue;
}

- (id)init {
    self = [super init];
    if( !self ) return nil;

    _someWorkerQueue = dispatch_queue_create("com.company.MyWorkerQueue", 0);
    return self;
}

- (void)performJob {
    dispatch_async(_someWorkerQueue, ^{
        //do some work asynchronously here
    });

    dispatch_async(_someWorkerQueue, ^{
        //more asynchronous work here
    });
}
@end
Run Code Online (Sandbox Code Playgroud)