Iphone 核心数据、文件下载和线程安全

Iphone 核心数据、文件下载和线程安全,iphone,multithreading,core-data,download,Iphone,Multithreading,Core Data,Download,使用核心数据时,跨线程持续共享数据的首选方法是什么?我正在下载一个大文件,希望在UIProgressBar中显示下载进度。实际下载发生在由NSOperation创建的后台线程中 下载信息(本地路径、总字节数、接收字节数)被建模为核心数据管理对象,实际文件存储在文档/目录中。我想到的一个解决方案是在后台线程中创建一个单独的托管对象上下文,并将objectID传递给它,然后使用objectWithID:方法将其拉上来。每当后台线程执行保存操作时,主线程都会收到一个通知,主上下文会合并这些更改,随后会

使用核心数据时,跨线程持续共享数据的首选方法是什么?我正在下载一个大文件,希望在
UIProgressBar
中显示下载进度。实际下载发生在由
NSOperation
创建的后台线程中

下载信息(本地路径、总字节数、接收字节数)被建模为核心数据管理对象,实际文件存储在文档/目录中。我想到的一个解决方案是在后台线程中创建一个单独的托管对象上下文,并将
objectID
传递给它,然后使用
objectWithID:
方法将其拉上来。每当后台线程执行保存操作时,主线程都会收到一个通知,主上下文会合并这些更改,随后会更新表视图

这种方法是可行的,但是保存不能太频繁,否则UI会冻结。因此,在接收到每X KB的数据后,UI都会更新,其中X必须至少为500 KB,UI才会有一定的响应性。是否有更好的方法在接收下载进度数据时将其传递给主线程


编辑:使用KVO会有帮助吗?如果是的话,你知道关于这个主题有什么好的教程吗?

我知道你已经构建了自己的系统,但是我使用它来进行所有的网络操作。它非常健壮,有很多好处,比如文件恢复、直接保存到磁盘、上传进度监控、下载进度监控和厨房水槽。如果您不使用它,您可以查看源代码以了解他们是如何做到这一点的,因为当我在这个框架中使用进度报告时,UI从未冻结。

尽管我将在我的项目中使用AsitpRequest,但为了完整性,提及我的问题解决方案仍然很好。这有点明显,但每隔几秒钟就保存一次核心数据上下文是一个可怕的错误

相反,我向下载操作添加了一个进度委托,它在主线程上获取更新通知

NSNumber bytesDownloaded = [NSNumber numberWithLongLong:[data length]];
[downloadDelegate performSelectorOnMainThread:@selector(updateProgress:) withObject:bytesDownloaded waitUntilDone:NO];

重要的是在主线程上将下载进度信息传递给代理。代理会更新进度,不断累积更改,并在下载完成时或以更大的时间间隔进行保存。

首先,能够向上投票真是太好了!ASIHTTPRequest看起来非常好,我将把它集成到我的代码中。它提供了比我的小下载框架多得多的功能,而且是开源的:)