gpt4 book ai didi

ios - 设置 NSStreams 的正确方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:28 27 4
gpt4 key购买 nike

我正在编写一个点对点蓝牙聊天小应用程序。我目前正在做的是:

let thread = Thread(block: { [weak self] in
guard let `self` = self else { return }

self.channel.inputStream.delegate = self
self.channel.inputStream.schedule(in: .current, forMode: .defaultRunLoopMode)
self.channel.inputStream.open()

self.channel.outputStream.delegate = self
self.channel.outputStream.schedule(in: .current, forMode: .defaultRunLoopMode)
self.channel.outputStream.open()

RunLoop.current.run()
})

thread.start()

self.channelCBL2CAPChannel我目前面临的问题是它为每对 channel 生成新线程,最终有太多线程挂起。

在这种情况下,设置 CBL2CAPChannel 的正确方法是什么? Apple 的文档为此使用主线程,这是出乎意料的,并且在有很多连接时可能会导致问题。

最佳答案

Apple's docs are using main thread for this, which is unexpected and could lead to problems when there are a lot of connections.

这并不意外;这是完全正常的。您不应该为每个流创建单独的线程。运行循环的全部要点是在不创建新线程的情况下处理并发。在运行循环编程中,您很少创建新线程。 Run loop 编程早在多核系统之前就出现了,专为协作式多任务处理(而不是抢占式多任务处理)而设计。

即使你想把东西放到其他核心上,你也不应该创建一个 Thread 对象,除非你正在与需要它的 C++ 代码交互。将近十年来,直接使用 NSThread 的理由并不多。 You pass the work to GCD using DispatchQueue.将流中的数据传递到另一个调度队列进行处理是一种非常正常的方法,并且几乎所有的工作都从主队列中完成(然后主队列只进行协调)。

如果您有大量连接,或者它们非常繁忙,那么您可以考虑将它们全部 放到一个单独的线程中(不是每个连接一个线程;总共一个线程)。但在 L2CAP 速率下,您不太可能需要这样做。我为 G4 构建的 Mac 聊天应用程序的功能不如 iPhone 5 的单线程。

关于ios - 设置 NSStreams 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53707426/

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