6

いくつかのコードを使って、私はNSOperationの中に新しくなった実行ループに出くわします。NSOperationでNSThreadスリープを使用する

NSOperationはデータのダウンロード中にビジー状態ですが、ダウンロードが完了するのを待つコードはNSRunLoop秒です。スレッドスリープ状態です。私は実行ループについて読んだ

while (aCertainConditionIsTrue && [self isCancelled]==NO) { 
    if(![[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]){ 
     [NSThread sleepForTimeInterval:1.0]; 
    } 
} 

、およびrunMode:beforeDate:は、入力ソースまたはタイムアウトを待ちます:

特にこのコードは、私には興味があります。私は100%ではありませんが、何が入力ソースとして数えられますか。このことの最初の実行で

は常にNOを返すとsleepForTimeInterval:に当たります。これは悪いですか?特定のユーティリティクラスで

、それはsleepForTimeInterval:をたくさん打っています - 一度、各スレッドのために - パフォーマンスが大幅に痛いです。

これ以上の解決策やアドバイスはありますか?

答えて

2

スレッドをロックアップ眠れます。おそらくperformSelector:withObject:afterDelayを使用するようにコードを変更します。そうすれば、あなたのスレッドは引き続き実行できます。

... 
    done = NO; 
    [self checkDoneCondition:nil]; 
    ... 

- (void)checkDoneCondition:(id)object { 
    if (aCertainConditionIsTrue && [self isCancelled]==NO) { 
     if(...) { 
      [self performSelector:@selector(checkDoneCondition:) withObject:[con error] afterDelay:1.0]; 
     } else { 
      done = YES; 
     } 
    } 
} 
1

あなたは同時 NSOperationを使用する必要があるように見えます。ここでは、アップルのドキュメント内の関連する部分である:同期走る非同時動作とは対照的に

、 同時動作は非同期で実行されます。つまり、 が同時操作の開始メソッドを呼び出すと、そのメソッドは対応するタスクが完了する前に に戻ることができます。オペレーションオブジェクトが新しいスレッドを作成して というタスクを実行したか、またはそのオペレーションが非同期関数と呼ばれたために、 が発生する可能性があります。 呼び出し元に制御が戻りますが、それは現在進行中の可能性だけという場合の動作が継続中である場合、それは実際には関係ありませ ありません。同時動作で (...) 、あなたのstartメソッドは非同期に動作を開始する する責任があります。 スレッドを生成するか非同期関数を呼び出すかは、このメソッドから行います。 操作を開始すると、startメソッドは、isExecuting メソッドによって報告された操作の実行状態を 更新する必要があります。あなたは興味を持って、クライアントが 操作が現在実行されていることを知ることができます isExecutingキーのパス、のためにKVO通知を送信することによってこれを行います。 isExecutingメソッドは、スレッドセーフな方法で のステータスも返す必要があります。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.htmlから)言い換えれば、あなたはNSOperationのサブクラスで-startメソッドをオーバーライドし、executingfinishedプロパティのIVARを持つことができます。このメソッドは別のスレッドでダウンロードを開始します。ダウンロードが開始されると、executingフラグが設定され、KVOがトリガされます。このスレッドで完了したら、finishedexecutingと同じことをします。それは複雑に見えますが、実際は非常に簡単です。

さらに詳しい説明を読むと、スタックオーバーフローに関するこの質問もご覧ください。Subclassing NSOperation to be concurrent and cancellable

関連する問題