【问题标题】:iOS - Concurrent access to memory resourcesiOS - 并发访问内存资源
【发布时间】:2012-06-18 17:55:39
【问题描述】:

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

【问题讨论】:

    标签: ios xcode multithreading locking multitasking


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我正在使用 NSURLConnection。假设我们在一个可变数组上有一个 for 循环,如果另一个任务(连接成功)尝试在数组末尾添加一个对象,而 for 循环正在执行,会发生什么?您能否在这种情况下举一个可重入代码的简短示例?
    【解决方案2】:

    您可能需要查看 Grand Central Dispatch (GCD) 和障碍物块。障碍物可以让你在后台做你想做的事并“锁定”资源。

    查看 Apple 文档和 Mike Ash 在 GCD 上的博文 here

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

    祝你好运

    提姆

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2018-06-19
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      相关资源
      最近更新 更多