1

次のプロパティを持つObjective-Cクラスがあります。

@property (nonatomic, copy) NSString *myString;

myString に割り当てられる値は、リモート サーバーから取得されます。を使用して、別のスレッドでリモート コンテンツをダウンロードしますperformSelectorInBackground。データがダウンロードされたら、 を使用してメイン スレッドのセレクターに渡しますperformSelectorOnMainThread:withObject:。このセレクターで、データを myString に割り当てます。

メインスレッドのセレクターで myString が nil かどうかを安全に確認するにはどうすればよいですか?

if (myString)ですから、メインスレッドのセレクターで質問したいと思います。ただし、スレッドの考慮事項についてはわかりません。おそらくこれは、プロパティがアトミックであるべきケースです。

4

3 に答える 3

4

メイン スレッドが にアクセスするシステム内の唯一のスレッドであるmyString場合、プロパティ アクセスは事実上シングルスレッドであり、 は必要ありませんatomic。メイン スレッドだけが書き込みを行っているが、他のスレッドも読み取りを行っている場合はmyString、プロパティを宣言するatomicことをお勧めします。マルチスレッド アクセスの場合は、NSStringではなく不変を使用するようにしてNSMutableStringください。これは、プロパティを作成してもatomic、可変文字列が、書き込みと同時に実行される読み取りで誤った結果を返さないようにすることにはならないためです。

于 2012-08-29T03:47:00.997 に答える
1

メイン スレッドでそのプロパティの値の読み取りと書き込みの両方を行う場合、同時実行性はなく、特別な予防措置を講じる必要はありません。

于 2012-08-29T03:48:48.693 に答える
1

によってトリガーされるメソッドに入るperformSelectorOnMainThread:と、スレッドに関する考慮事項は終わりです。myStringメインスレッド以外へのアクセスがない場合、競合するものは何もなく、明らかなif (myString)ことは機能します。

ただし、を使用しているNSURLConnection場合は、おそらく複雑すぎます。スレッドをまったく使用せずにネットワーク リクエストを非同期に実行できます。

于 2012-08-29T03:50:24.263 に答える