iOS – 并发访问内存资源

我的应用程序从服务器,数据和数据描述符下载几个资源。 这些由用户操作触发的下载可以同时执行,比方说,一次最多可下载50个下载。 所有这些asynchronous任务最终都会在内存中创build对象(例如将叶子附加到数据结构上,例如将可变字典或对象添加到数组中)。 我的问题是:这可能会导致稳定性问题? 例如,如果有几个同时发生的任务尝试将密钥添加到同一个字典中,我是否应该处理这种情况,放置某种锁? 如果我实现一个for循环来查找数组中的graphics元素,是否有可能其他正在运行的任务可能会在循环中更改数组内容? 关于除了官方文档以外的多任务,multithreading问题的任何参考或重要的一般定位?

取决于你如何处理下载 – 如果你正在使用NSURLConnection,它会为你处理单独的线程/并发,你代码是可重入的,因此你不必担心同时发生的事情。 如果你正在创build自己的线程,你可能有问题。

编辑:你的代码运行在一个主线程(主运行循环),可以说你有一个NSURLConnection也运行,然后它将运行在一个单独的线程。 但是,处理正在进行连接时发生的事件的委托代码在运行循环中运行,而不在其他线程中运行。 这意味着你的代码一次只能执行一件事情。 连接成功的方法不会其他任何代码同时被调用。 如果你有一个for循环运行,那么它会阻塞你的主线程,直到它完成循环,同时如果连接完成而for循环仍在运行,那么你的委托代码将不会执行,直到循环结束。

你可能想看看大中央调度(GCD)和障碍。 屏障块将允许你在后台做什么,并“locking”资源。

在GCD上查看苹果文档和Mike Ash的博客文章。

基本的要点是,您使用您创build的并发队列来执行读取操作,并使用障碍块来阻止对该资源进行写入的所有访问。 好东西。

祝你好运

蒂姆