在使用NSURLConnection的块时,@ synchronize访问变量是必要的吗?

时间:2012-04-25 15:01:27

标签: ios nsurlconnection

我有一个高级类,通过使用其他类来进行多次连接(顺序,不并行),而这些类又使用NSURLConnection。

这些辅助类之一下载一个项目数组,它通过委托协议作为NSArray传递给高级类。高级类具有自己的NSArray,并将下载的项添加到其数组中。

我在继承层次结构中有几个类,每个类负责下载或上传不同的内容,所有类都由高级类控制,高级类为每个类实现协议。但是我认为在这个继承层次结构中有几个类可能有点过分,我正在考虑使事情更简单,并且想知道如果不是有几个对象我可以减少它并通过高级类为它们提供一个行为的差异在内容下载上执行的块。

例如,高级类将提供代码来解析并创建作为块下载的NSArray。

以草图伪形式:

@interface highLevelClass : NSObject
@property (strong, nonatomic) NSArray *theArray;
@property (strong, nonatomic) downloadingClass *theDownloader;
- (void) doDownload;
@end



@interface downloadingClass : NSObject
@property (strong, nonatomic) NSURLConnection *connection;
- (void) downloadArrayWithBlock:(void(^)()) theBlock;
@end



- (void) doDownload {
    [theDownloader: downloadArrayWithBlock:^ {
       [self.theArray appendObject: someObject]; 
     }
}

downloading class would execute the block in its implementation of NSURLConnectionDelegate:connectionFinishedLoading.

首先我假设highlevelClass需要使用__block声明theArray?

但我的主要问题是:我是否需要做任何事情,如果是这样的话,是什么以及如何保护TheArray以防止可能的同时访问?

highLevelClass可能会从theArray中删除一个项目以响应计时器事件或用户操作。我的代码没有使用任何线程,因此其中的所有内容都可以是非原子的,并且不需要防止同时更新。但是NSURLConnection在内部产生了一个我相信的新线程,因此如果theArray在传递给downLoading类的块中,是否存在危险的可能性?

1 个答案:

答案 0 :(得分:0)

如果您没有自己生成任何线程,则无需采取任何预防措施。虽然NSURLConnection确实生成了自己的线程来执行异步下载,但它也需要在开始下载的线程上发送所有委托消息。在您的情况下,由于您在主线程上开始所有下载,您知道所有代理消息也将在主线程上接收。

并且,对于__block说明符,只有当块将指针更改为该数组时,才需要它,而不是它所指向的数组。