私は「必要なものを入力するだけでいいですか?」と、どのような種類のスレッドでどのような作業をしているのかを具体的に説明する必要があるときはいつでも理解しようとしています。メインスレッドで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コールにラップする必要がありますか?
手近な質問に集中するために、すべてのエラー処理を省略しました。
「私はもちろんですが、実際に必要か、あるいは理にかなっているかどうかわからず、あらゆる種類の場所に発送することができます。私はこれが問題の解決策であることはよく知っていますが、問題を理解しようとしています。しかし、あなたの説明に感謝します。私は自分自身をさらに教育しようとするためにドキュメンテーションを見ました。私はAFNetworkingを使用しています。これは、特に指定されていない限り、メインスレッドでcompletionBlocksをデフォルトで実行するように見えるので、何もする必要はありません。あなたはofcを知ることができませんでした。 – nickdnk
もちろん、十分です。問題の2つの側面、つまりどのスレッドがこれであるか、そしてこれらのスレッドセーフな動きがわれわれの間で願っています。 – matt
はい、ありがとうございます。 AFNetworkingがメインスレッド上でcompletionBlocksを実行すると仮定すると、そのブロック内のプロパティ(myMutableArray)に直接アクセスすることは可能です*同じスレッドによってアクセスされているため同じ時間に配列を変更する仮想UIButtonイベント?言い換えると;それは同時にではないでしょう。 – nickdnk