1

私のアプリでは、操作を使用して時間のかかるタスクを実行しているため、ユーザー インターフェイスがフリーズすることはありません。そのために、NSInvocationOperation を使用します。コードを実装して実際にタスクを完了する前に、最初に全体的なアーキテクチャをテストしたかったので、それが今の私が持っているものです:

// give the object data to process
- (void)processData:(NSObject*)dataToDoTask {

    ... // I store the data in this object

    NSInvocationOperation *newOperation =
    [[NSInvocationOperation alloc] initWithTarget:self
                                         selector:@selector(performTask)
                                           object:nil];

    [[NSOperationQueue mainQueue] addOperation:newOperation];

    ...

}

// process data stored in the object and return result
- (NSObject*)performTask {

    [NSThread sleepForTimeInterval:1]; // to emulate the delay
    return [NSString stringWithFormat:@"unimplemented hash for file %@", self.path];
}

ただし、スリープは期待どおりに機能しません。操作の完了を遅らせる代わりに、アプリをフリーズさせます。どうやら私は操作か睡眠のどちらかが間違っているようですが、どちらがどのように行われているかわかりません。

4

1 に答える 1

3

これは、メイン スレッド (ユーザー インターフェイスの実行と同じ) で操作を実行しているためです。

オペレーションを同時に実行する場合は、新しいオペレーション キューを作成します。

NSOperationQueue * queue = [NSOperationQueue new];
[queue addOperation:newOperation];
于 2012-06-10T21:10:15.163 に答える