iPhone-在多个NSURL连接结束时写入文件而不发生冲突

iPhone-在多个NSURL连接结束时写入文件而不发生冲突,iphone,objective-c,file,asynchronous,nsurlconnection,Iphone,Objective C,File,Asynchronous,Nsurlconnection,我有一个CONNECT对象,它使用以下命令进行HTTP调用: NSURLConnection* connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self]; 在-(void)connectionIDFinishLoading:(NSURLConnection*)connection方法中,我将内容写入文件 我可能有来自多个CONNECT对象实例的多个HTTP调用,因此我认为这些CONNECT对象在连

我有一个CONNECT对象,它使用以下命令进行HTTP调用:

NSURLConnection* connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];
-(void)connectionIDFinishLoading:(NSURLConnection*)connection
方法中,我将内容写入文件

我可能有来自多个CONNECT对象实例的多个HTTP调用,因此我认为这些CONNECT对象在连接结束时同时写入文件是有风险的


这是正确的吗?如果是,我如何防止这种情况发生?

如果只有一个线程,那么就不会有任何问题,因为委托将在同一个线程上执行。
委托在单线程环境中一个接一个地执行。如果您的DelegateMehtod1正在访问该文件,并且由于DelegateMehtod2而暂停,然后DelegateMehtod2访问该文件,则不会出现这种情况。这仅在多个线程中发生,而不是在具有一个线程的多个委托中发生

如果是多线程环境,则必须同步文件访问代码。

两件事:

1) 如果在单个线程(很可能是主线程)上运行所有NSURLConnections,那么只要在ConnectionIDFinishLoading方法中执行整个写入(即打开/创建、写入、关闭),就不会有任何写入文件的问题。这是因为单个线程一次只能做一件事

2) 在设计方面,您真的希望多个连接写入同一个文件吗?如果您正在创建大量NSURLConnection,那么通常您希望能够记录它们,为它们指定唯一的文件名并单独处理它们。这样,您就可以知道当前飞行中有多少连接,取消连接,等等

如果您只是在处理过程中向文件写入一些短期数据,那么可能需要为文件名使用唯一的名称。基本上,我发现很难找到一个好的理由,让大量的并发下载在完成时写入同一个文件-但也许你有一个