- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个点对点蓝牙聊天小应用程序。我目前正在做的是:
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.channel
是 CBL2CAPChannel
我目前面临的问题是它为每对 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/
我想使用 nsstreams 发送和接收一些数据。我不想让我的代码如此困惑,所以我想知道: 我是否需要保留对 NSStream 的强引用,或者 [NSStream scheduleInRunLoop:
我正在将文件上传到服务器,使用 NSStream API 分块读取。我正在尝试显示一个显示上传进度的进度条。我无法找到可靠的解决方案来确定读入文件的字节数。更改文件和 block 大小,我仍然不断获取
我真的不能理解这个事件。 我希望在发送队列(或类似内部结构)发送完先前写入的数据包后调用它。 这是正确的假设吗? 我正在通过Multipeer连接开发视频流,我想使用此属性来决定是否应该放下摄像机框架
我有一个应用程序在另一个线程上使用 NSStream 连接到服务器。如果用户决定注销,应用程序也会关闭连接。问题是我永远无法在用户断开连接后成功关闭流或线程。下面是关于如何为网络创建线程并尝试关闭流的
在我正在开发的 iPad 应用程序中,我需要将网络处理放在一个单独的线程上,因为它偶尔会阻塞应用程序的 UI。目前,我已经创建了一个 Connection 对象,所有网络逻辑都在其中进行( NSStr
我正在尝试在 iOS 上编写 telnet 客户端,但无法正确设置流。我认为它们可以工作,但每次触发委托(delegate)方法时我都会得到空缓冲区。 以下是我设置流的方式: self.manager
我在 iOS 中进行客户端-服务器通信已经有一段时间了,但我遇到了一个我无法理解的问题。 我写了两个基本函数:一个向服务器发送数据,另一个从服务器接收数据。每个都有一个名为 timeout 的参数,它
我有一个连续打开的 TCP 连接,用于与外部设备通信。通信管道中发生了很多事情,导致 UI 有时变得无响应。 我想将通信放在一个单独的线程中。我了解 detachNewThread 以及它如何调用 @
在Ray Wenderlich tutorial on sockets为了从 Objective-C 中的输入流中读取字节,我们做了 uint8_t buffer[1024]; int
我在连接到服务器的 iphone 应用程序中有一个 NSInputStream 和一个 NSOutputStream。我能够毫无问题地将数据读取和写入套接字。问题是我有一个断开连接按钮,当我尝试在其中
如何同步调用NSStream获取结果?? 目前我在其委托(delegate)方法之一中收到异步回调 `(void)stream:(NSStream *)theStream handleEvent:(
全部, 我已经通过注释、断点等方式将它运行到这一点。程序在标记的代码处崩溃。 -(void) initNetworkCommunication { CFReadStreamRef readSt
我编写了一个程序,使用 Apple 流编程指南中概述的 NSStream 协议(protocol)连接到给定 IP 上的服务器。数据的连接和传输工作完美,但是如果用户指定了错误的 IP 并且程序尝试打
我有一个使用 NSStream 进行连接的客户端-服务器应用程序。有时,当尝试打开连接时,连接的一侧在第一次尝试发送消息时会收到 NSStreamEventEndEncountered。 我使用 CF
我正在尝试为 NSStream 编写包装器之类的东西,以使我的生活更轻松。我只想知道什么时候建立连接,什么时候关闭,写一些数据获取接收到的数据。所以我在想这样的事情: 标题: @interface S
我需要从家庭自动化服务器获取设备列表的状态。我要查询的设备在一个数组中。 我正在尝试循环遍历该数组,对于每个设备,我正在向服务器发送数据。我遇到的问题是服务器只收到一个包含我的 3 个命令的字符串。
一切都按预期工作,只是一步一步抛出调试器,否则我会得到 EXC_BAD_ACCESS。我想我需要在某个地方延迟或等待(最好)某件事。 // 1) Create streams(input/output
我正在使用 Objective-C 创建一个基于套接字的 iOS 应用程序,现在我的要求是同时连接到两个服务器。 我正在使用 NSInputStream 和 NSOutputStream,我能够连接到
使用ExternalAccessory与蓝牙设备通信,我使用EASession提供的输入和输出NSStreams向其发送消息。 在Apple的EADemo示例中,它将两个流调度到主线程的运行循环。但是
我正在使用 NSStream 通过 MCSession 发送大量的 UIImage 数据。 当我得到字节时 - (void)stream:(NSStream *)aStream handleEvent
我是一名优秀的程序员,十分优秀!