2016-03-28 11 views
0

私は「必要なものを入力するだけでいいですか?」と、どのような種類のスレッドでどのような作業をしているのかを具体的に説明する必要があるときはいつでも理解しようとしています。メインスレッドでNSURLSessionDataTask補完ブロックが呼び出されていますか?

私が理解するように、私はメインスレッドのUIを更新するだけです。このようなことをするのは大丈夫ではないということですか?私はこれをGDCコールに入れるべきですか?

[sessionManager dataTaskWithRequest:aRequest completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 

    someUILabel.text = @"Hello!"; // Updating my UI 
    [someTableView reloadData]; // Ask a table view to reload data 

}]; 

これはUI部分用です。今、私のクラスのどこかにNSMutableArrayがあるとしましょう。私は、たとえば、UIButtonをタップすることによって、この配列にオブジェクトを追加または削除します。その後、再び私はNSURLSessionDataTaskがそうのように、いくつかのデータを取得し、私のNSMutableArrayにそれをロードするためにどこかのサーバーに行く必要があり:

[sessionManager dataTaskWithRequest:aRequest completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 

    myMutableArray = [[responseObject objectForKey:@"results"] mutableCopy]; 

}]; 

これは、UIの操作ではありません。完了ブロックの実行中にボタンタップ(つまり、[myMutableArray insertObject:someObj atIndex:4];)を追加すると、競合状態でクラッシュするのを防ぐためにGDCコールにラップする必要がありますか?

手近な質問に集中するために、すべてのエラー処理を省略しました。

答えて

3

TLDR:完了ハンドラ内でdispatch_async(dispatch_get_main_queue()...と呼ぶことはありません。ただしてください。

ロング回答

のは、ドキュメントを見てみましょう、我々うか。

completionHandlerロード要求が完了したときに呼び出される補完ハンドラ。このハンドラはデリゲートキューで実行されます。

委任キューは、sessionWithConfiguration:delegate:delegateQueue:でNSURLSessionを作成したときに渡したキューです。 NSURLSessionをどのように作成したのか分からなければ、は完了ハンドラが呼び出されたキューについてと仮定しないことをお勧めします。 [NSOperationQueue mainQueue]をこのパラメータとして渡さなかった場合は、バックグラウンド・キューにあり、スレッド・セーフでないものを実行する前にメイン・キューにブレークアウトする必要があります。

だから今の質問は:スレッドセーフなUIを更新し、テーブルビューと話す

  • ですか?いいえ、あなたはメインキュー上でのみそれらのことをしなければなりません。

  • スレッドセーフでmyMutableArrayを設定できますか?いいえ.2つのスレッド(メインキュー、通常はこのプロパティと通話し、の場合はキュー)の間にプロパティself.myMutableArrayを共有しているためです。

+0

「私はもちろんですが、実際に必要か、あるいは理にかなっているかどうかわからず、あらゆる種類の場所に発送することができます。私はこれが問題の解決策であることはよく知っていますが、問題を理解しようとしています。しかし、あなたの説明に感謝します。私は自分自身をさらに教育しようとするためにドキュメンテーションを見ました。私はAFNetworkingを使用しています。これは、特に指定されていない限り、メインスレッドでcompletionBlocksをデフォルトで実行するように見えるので、何もする必要はありません。あなたはofcを知ることができませんでした。 – nickdnk

+0

もちろん、十分です。問題の2つの側面、つまりどのスレッドがこれであるか、そしてこれらのスレッドセーフな動きがわれわれの間で願っています。 – matt

+0

はい、ありがとうございます。 AFNetworkingがメインスレッド上でcompletionBlocksを実行すると仮定すると、そのブロック内のプロパティ(myMutableArray)に直接アクセスすることは可能です*同じスレッドによってアクセスされているため同じ時間に配列を変更する仮想UIButtonイベント?言い換えると;それは同時にではないでしょう。 – nickdnk

関連する問題