gpt4 book ai didi

ios - 将 block 与 NSURLConnection 一起使用时,是否需要 @synchronize 访问变量?

转载 作者:行者123 更新时间:2023-11-28 17:34:12 26 4
gpt4 key购买 nike

我有一个高级类,它通过使用其他类建立多个连接(顺序地,而不是并行地),而每个类又使用一个 NSURLConnection。

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

我在继承层次结构中有几个类,每个类负责下载或上传不同的内容,所有这些都由为每个类实现协议(protocol)的高级类控制。然而,我认为在这个继承层次结构中有几个类可能有点矫枉过正,我正在考虑让事情变得更简单,并且想知道我是否可以减少它而不是有几个对象,并通过为它们提供的高级类来获得行为上的差异阻止在内容下载时执行。

例如,高级类将提供代码来解析和创建作为 block 下载的 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 类的 block 内,是否存在危险?

最佳答案

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

而且,对于 __block 说明符,您只需要在 block 将指针更改为该数组而不是它指向的数组时使用。

关于ios - 将 block 与 NSURLConnection 一起使用时,是否需要 @synchronize 访问变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10318342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com