1

我有一个高级类,它通过使用其他类来建立多个连接(顺序地,而不是并行地),而其他类又使用一个 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 的 theArray 需要使用 __block 来声明?

但我的主要问题是:我是否需要做任何事情,如果需要做什么以及如何保护 theArray 免受可能的同时访问?

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

4

1 回答 1

0

如果您自己不产生任何线程,则无需对锁采取任何预防措施。虽然 NSURLConnection 确实会产生自己的线程来执行异步下载,但它也会注意在开始下载的线程上发送其所有委托消息。在您的情况下,由于您在主线程上开始所有下载,您知道您的所有委托消息也将在主线程上收到。

而且,至于说明__block符,您只需要如果块将更改指向该数组的指针,而不是它指向的数组。

于 2012-04-25T15:48:04.743 回答