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是一件好事。在多线程访问的情况下,请确保使用 immutableNSString而不是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 回答