0

Cocoa 10.6 での同時実行の問題をデバッグする方法について、いくつかのガイダンスが必要です。「for」ループを NSOperations を使用するように変換していますが、ほとんどの場合、ループのある時点でコードがフリーズします。コンソールに NSLog の出力が表示されます。まれに、コードが最後まで実行されても問題ない場合があります。

コードはモデル層のみで、コントローラーのメソッドから開始されます。このメソッドは、8 ~ 10 個のモデル オブジェクトをループして、それぞれの出力を一意の名前のファイルに書き込むように指示します。8 つのモデル オブジェクト = 8 つの個別のファイル。GUI への呼び出しはなく、モデル オブジェクトは NSManagedObject サブクラスであり、子 NSManagedObject オブジェクトのセット (0..n 個) を含み、各所有オブジェクトが要約して書き出します。出力形式は JSON です。

コード:

__block NSMutableArray *collectionOfCourses = [[NSMutableArray alloc] initWithCapacity:[[self courses] count]];

/* Create a filename.  Use our title and set it to lowercase */
NSURL *ourFileURL = [aURL URLByAppendingPathComponent:[[self title] lowercaseString]];
ourFileURL = [ourFileURL URLByAppendingPathExtension:@"js"];

for (Course *aCourse in [self courses]) {
       [[self opQueue] addOperationWithBlock:^{
       NSArray *arrayForOneCourse = [aCourse arrayAndWriteToFileURL:aURL fileFormat:format];
   [collectionOfCourses addObject:arrayForOneCourse];
    }];
}

私は多くの NSLog を実行していますが、それが問題になるでしょうか? バックグラウンド スレッドからの NSLog'ing は悪いことですか?

ブロック内から可変配列に追加するので、可変配列を __block として宣言するのは正しいですか? 私は両方の方法で試してみましたが、このフリーズの問題に関連する違いはないようです。

Xcode v4 を使用してこの問題をデバッグするにはどうすればよいですか? フリーズしているコード行、または同時に実行されて実行をブロックしている 2 行のコードを知りたい.単一のブレークポイントを設定してコードをステップ実行する以前の手法は機能しなくなりました、同時実行のため。

ありがとう

4

1 に答える 1

3

ブロックスコープの変数とは関係ありません。あなたの問題は、どのような形でもスレッドセーフでNSMutableArrayもないということです。NSManagedObjectここでしていることはできません。これをメイン スレッドから処理したい場合は、ディスパッチ キューなどを使用して各アイテムを順次処理する必要があります (メイン スレッドに戻った場合でも、同じキューを使用してから読み取りを行う必要があります)。ただし、作業が終了したら可変配列を不変バージョンにコピーし、新しい不変配列を使用して通知またはコールバックをメイン スレッドにディスパッチする方がおそらく簡単で安全です。コピー埋め込み。

于 2011-03-16T00:52:46.153 に答える