我一直在编写一些代码来替换一些现有的:
while(runEventLoop){
if(select(openSockets, readFDS, writeFDS, errFDS, timeout) > 0){
// check file descriptors for activity and dispatch events based on same
}
}
套接字读取代码。我想将其更改为使用 GCD 队列,以便我可以使用 dispatch_async 将事件弹出到队列中,而不是维护“必须在下一次迭代时调用”数组。我也已经在使用 GCD 队列来 /contain/ 这个特定的操作,因此希望将其转移到更自然的 GCD 调度形式。(不是独占串行队列的 while() 循环)
但是,当我尝试将其重构为依赖于从绑定到套接字描述符上的 DISPATCH_SOURCE_TYPE_READ 和 DISPATCH_SOURCE_TYPE_WRITE 的事件处理程序中触发的调度源的表单时,依赖于此调度的库代码停止工作。我的第一个假设是我误解了 DISPATCH_SOURCE_TYPE_READ 和 DISPATCH_SOURCE_TYPE_WRITE 的使用——我曾假设它们会产生与使用这些套接字描述符调用 select() 大致相同的行为。
我是否误解了 GCD 调度来源?或者,关于重构,我是否在不适合的情况下使用它?