iOS - 内存资源的并发访问

5
我的应用程序从服务器下载多个资源,包括数据和数据描述符。这些由用户操作触发的下载可以同时进行,比如说最多可同时执行50个下载。所有这些异步任务最终都会在内存中创建对象(例如将叶子附加到数据结构中,例如向可变字典添加键或向数组添加对象)。我的问题是:这会导致稳定性问题吗?例如,如果几个同时运行的任务尝试向同一个字典添加键,我是否应该处理这种情况,放置某种锁?如果我实现了一个for循环,在数组中查找图形元素,是否可能其他正在运行的任务可能会在“期间”更改数组内容?除了官方文档之外,是否有任何关于这个多任务、多线程问题的参考或主要的总体方向?
2个回答

1

这取决于你如何处理下载 - 如果你使用NSURLConnection,它会为你处理单独的线程/并发,因此你不必担心同时操作的问题。如果你创建自己的线程,你可能会遇到问题。

编辑: 你的代码在主线程(主运行循环)中运行,假设你有一个正在运行的NSURLConnection,那么它将在另一个线程中运行。然而,处理连接过程中发生的事件的委托代码在你的运行循环中运行,而不是在其他线程中。这意味着你的代码一次只能执行一件事情。连接成功的方法不会与你的其他代码同时调用。如果你有一个for循环在运行,那么它会阻塞你的主线程,直到循环完成,同时如果连接在for循环仍在运行时完成,则你的委托代码将在循环完成后才执行。


是的,我正在使用NSURLConnection。让我们想象一下,在可变数组上有一个for循环,如果另一个任务(连接成功)尝试在数组末尾添加一个对象,而for循环正在执行,会发生什么?您能否在这种情况下提供一个简短的可重入代码示例? - user236739

1

你可能想要了解Grand Central Dispatch(GCD)和屏障块。屏障块将允许你在后台执行所需操作并“锁定”资源。

请查看苹果文档和Mike Ash的博客文章这里关于GCD的内容。

基本思路是使用创建的并发队列来执行读取操作,并使用屏障块阻止所有写入该资源的访问。非常好的东西。

祝你好运

蒂姆


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接