gpt4 book ai didi

cocoa-touch - NSStream run loop调度使用GCD带来的并发问题如何处理?

转载 作者:行者123 更新时间:2023-12-04 03:25:23 25 4
gpt4 key购买 nike

我有以下情况,我创建了一个 GCD 调度队列并在其中安排了 NSStream到当前NSRunLoop ,正如其规范中要求的那样,它发出委托(delegate)事件,然后我使用 [[NSRunLoop currentRunLoop run] 使该线程的运行循环运行.

这会产生三种可能的情况:

  • 创建一个串行队列,其中初始写入消息通过流发送,其他写入消息仅在有来自 NSStream 的委托(delegate)回调时发送。对象,因为尝试在不遵守此模式的情况下写入新消息(这将是可取的)将失败,因为队列被运行的运行循环锁定。
  • 创建一个并发队列,其中消息可以自由写入流,因为发送到队列的 block 将与运行运行循环的 block 同时执行。然而,虽然希望写入消息和运行循环同时运行,但肯定不希望必须同时运行队列中的 block 来尝试同时写入流。
  • 创建两个队列——一个负责保持运行循环并接收从流中读取的回调,另一个负责将异步写入消息发送到流。这似乎很理想,但似乎 NSStream文档明确指出,不应尝试读取/写入调度线程之外的流。

  • 鉴于这些场景都不是理想的,如何解决这些问题?

    最佳答案

    派对迟到了,但您可以直接使用为您的流设置所需的调度队列,而不是使用运行循环

    void CFReadStreamSetDispatchQueue(CFReadStreamRef stream, dispatch_queue_t q);
    void CFWriteStreamSetDispatchQueue(CFWriteStreamRef stream, dispatch_queue_t q);

    其中 CFReadStreamRef 可以采用桥接的 NSInputStream,而 CFWriteStreamRef 可以采用桥接的 NSOutputStream。这样,您根本不必安排或取消安排运行循环,您的流将在后台运行。

    来自此 Apple sample code 的片段:
    CFReadStreamSetDispatchQueue((__bridge CFReadStreamRef) self.inputStream,  self.queue);
    CFWriteStreamSetDispatchQueue((__bridge CFWriteStreamRef) self.outputStream, self.queue);

    在 Swift 中,你可以直接调用函数:
    CFReadStreamSetDispatchQueue(inputStream, streamQueue)
    CFWriteStreamSetDispatchQueue(outputStream, streamQueue)

    关于cocoa-touch - NSStream run loop调度使用GCD带来的并发问题如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306642/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com