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

时间:2009-10-11 06:48:26

标签: iphone multithreading core-data download

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

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

此方法有效,但保存不能太频繁或UI冻结。因此,在接收到每X KB的数据之后更新UI,其中X必须至少为500 KB,以使UI具有一定的响应性。是否有更好的方法将下载进度数据传递给主线程?

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

2 个答案:

答案 0 :(得分:4)

我知道您已经构建了自己的系统,但我使用ASIHTTPRequest进行所有网络操作。它非常强大,有很多好东西,如文件恢复,直接保存到磁盘,上传进度监控,下载进度监控和厨房水槽。如果您不使用它,您可以查看源代码以了解它们是如何做到的,因为当我在此框架中使用进度报告时,UI永远不会冻结。

答案 1 :(得分:0)

虽然我打算在我的项目中使用ASIHTTPRequest,但仍然可以提一下解决问题的完整性问题。这是显而易见的,但每隔几秒就保存核心数据上下文是一个可怕的错误。

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

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

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