6

私はこれこれこれNSRunLoopのように、多くの投稿を読みました。しかし、実際に何をするのか理解できませんNSRunLoop

私が通常目にするのはワーカースレッドです

wthread = [[NSThread alloc] initWithTarget:self selector:@selector(threadProc) object:nil];  
[wthread start];

その中に 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];
}

そして、メインスレッドはこの wthread にいくつかの作業を渡します

[self performSelector:@selector(someWork:) onThread:wthread withObject:nil waitUntilDone:NO];

メイン スレッドからワーカー スレッドに作業を渡すという点では、多くの人がこれを行っているのを目にします。なぜここで NSRunLoop が必要なのですか? それは何をするためのものか ?

NSRunLoopイベントの管理に使用されることを読みましたが、内部でrunModethreadProcを呼び出す以外に何もないのはなぜですか?

4

2 に答える 2

5

あなたが示した例は、メソッド-threadProcが終了した後も実行を続けるスレッドを作成するための Cocoa イディオムです。なんで?

なぜなら:

  • 作成したNSRunLoopインスタンスには少なくとも 1 つの入力ソースがあります ( [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
于 2013-05-11T14:56:13.583 に答える