我正在尝试在脑海中找出构建 Cocoa 应用程序的最佳方式,该应用程序本质上是一个并发下载管理器。有一个应用程序与之对话的服务器,用户列出了很多要下拉的东西,然后应用程序处理该列表。(它没有使用 HTTP 或 FTP,所以我不能使用 URL 加载系统;我将讨论套接字连接。)
这基本上是经典的生产者-消费者模式。诀窍是消费者的数量是固定的,而且他们是持久的。服务器对可以同时打开的连接数(尽管通常至少两个)设置了严格的限制,并且打开新连接的成本很高,因此在理想情况下,相同的 N 个连接在应用程序的整个生命周期内都是打开的。
解决此问题的一种方法可能是创建 N 个线程,每个线程都将“拥有”一个连接,并在请求队列上等待,如果它为空则阻塞。由于连接的数量永远不会很大,这在实际系统开销方面并非不合理。但从概念上讲,Cocoa 似乎必须提供更优雅的解决方案。
似乎我可以使用, 并使用连接数进行NSOperationQueue
调用。setMaxConcurrentOperationCount:
然后我只是将下载请求扔到那个队列中。但在这种情况下,我不确定如何自己管理连接。(只需将它们放在堆栈上,并依靠队列来确保我不会过度运行/运行不足?与堆栈一起投入调度信号量?)
现在我们处于Grand Central Dispatch的美丽新世界,这是否开辟了解决这个问题的任何其他方法?乍一看,它看起来不像,因为 GCD 动态扩展并发的旗舰能力(在 Apple 关于改变生产者-消费者实现的建议中提到)实际上并没有帮助我。但我只是触及了阅读它的皮毛。
编辑:
万一这很重要:是的,我计划使用异步/非阻塞套接字 API 与服务器进行实际通信。所以 I/O 本身不必在自己的线程上。我只关心排队工作的机制,并(安全地)将其分配给连接,因为它们变得可用。