使用全局队列作为完成队列的{afnetworking

时间:2015-11-15 21:06:13

标签: ios afnetworking grand-central-dispatch

我们正在创建应用程序,有时会执行同步以更新数据库状态。有时它可能是大约100个请求,一个接一个地执行相当大的响应。为了处理完全同步,我们创建了单独的AFURLSessionManager实例。另一个管理器被指定用于与同步过程无关的请求(必须在主线程中处理)。

// Manager for requests related with sync process
syncManager = AFURLSessionManager(sessionConfiguration: ...)
syncManager.completionQueue = dispatch_queue_create("sync-queue", DISPATCH_QUEUE_SERIAL)

// Manager for requests not related with sync process (must be handled in main thread)
defaultManager = AFURLSessionManager(sessionConfiguration: ...) 

我们发现,对于旧设备(iPhone 4 / 4S),在同步过程中使用默认管理器执行请求确实会消耗更多时间。我们决定使用全局队列进行同步管理,如下所述:

syncManager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)

它提高了应用程序性能。我的问题是,使用全局队列(而不是串行队列)作为AFURLSessionManager的完成队列是否安全?你有没有使用过simillar方法?非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

全局队列实际上与您创建的串行队列非常不同 - 因为全局队列是并发的。放置在全局队列上的任务将由OS自动放置在理想​​的线程中。

与并发队列相关联的“风险”是因为任务可以在不同的线程上同时运行,如果您在不同的线程中读取/写入相同的属性,最终可能会遇到问题。

正如您所说,您正在更新数据库,这使得您使用并发队列来读取/写入数据库本身就是不安全

如果您只是阅读或只是写作,那么它不应该是一个问题。但仍有风险

我唯一的经验是制作了数百个读取/写入数据库的请求,而且我使用了一个没有问题的串行队列