我有一个Objective-C类,它具有以下属性:
@property (nonatomic, copy) NSString *myString;
分配给myString的值来自远程服务器。我使用performSelectorInBackground
在另一个线程中下载远程内容。下载数据后,我使用performSelectorOnMainThread:withObject:
将其传递给主线程上的选择器。在这个选择器中,我将数据分配给myString。
如何在主线程的选择器中安全地检查myString是否为nil?
所以我想在主线程的某个选择器中询问if (myString)
。但是我不确定线程的考虑因素。也许这是属性应该是原子的情况。
答案 0 :(得分:4)
如果主线程是系统中访问myString
的唯一线程,则属性访问实际上是单线程的,您不需要atomic
。如果主线程是唯一进行写入的线程,但其他线程也读取myString
,则声明属性atomic
是一件好事。在多线程访问的情况下,请确保使用不可变NSString
而不是NSMutableString
,因为即使使您的属性atomic
不能保护可变字符串不返回不正确的结果与读写同时运行的读取。
答案 1 :(得分:1)
如果您正在主线程上读取和写入该属性的值,那么就没有并发性,您不需要采取任何特殊的预防措施。
答案 2 :(得分:1)
进入performSelectorOnMainThread:
触发的方法后,您的线程注意事项就结束了。如果除了主线程之外你没有myString
的任何访问权限,那么没有任何东西可以与你竞争,显而易见的if (myString)
将起作用。
如果您正在使用NSURLConnection
,那么您可能会过度复杂化它。您可以在不涉及线程的情况下异步执行网络请求。