Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在主线程上调度的开放但非活动的NSStream是否可以移动到其他线程?_Objective C_Ios_Nsthread_Nsrunloop_Nsstream - Fatal编程技术网

Objective c 在主线程上调度的开放但非活动的NSStream是否可以移动到其他线程?

Objective c 在主线程上调度的开放但非活动的NSStream是否可以移动到其他线程?,objective-c,ios,nsthread,nsrunloop,nsstream,Objective C,Ios,Nsthread,Nsrunloop,Nsstream,我正在使用(并且被要求使用)我没有来源的第三方框架。第三方框架负责创建经过身份验证的客户机/服务器连接,并返回一对打开的NSStreams。我面临的挑战是,NSStreams被安排在主线程上(造成UI可能变得无响应的情况——我希望避免这种情况) 在流从第三方框架转移时,没有网络通信正在进行。所以,我想知道我是否可以不安排和重新安排NSStreams 有人知道是否可以取消对开放NSStream的调度,并在不同线程的不同运行循环上重新调度它吗?这会引起问题吗?有没有代码示例 提前谢谢 Aaron如果

我正在使用(并且被要求使用)我没有来源的第三方框架。第三方框架负责创建经过身份验证的客户机/服务器连接,并返回一对打开的NSStreams。我面临的挑战是,NSStreams被安排在主线程上(造成UI可能变得无响应的情况——我希望避免这种情况)

在流从第三方框架转移时,没有网络通信正在进行。所以,我想知道我是否可以不安排和重新安排NSStreams

有人知道是否可以取消对开放NSStream的调度,并在不同线程的不同运行循环上重新调度它吗?这会引起问题吗?有没有代码示例

提前谢谢


Aaron

如果我正确理解您的应用程序,这意味着您的应用程序接收到对特定流的引用,并且您负责读取流上的所有内容。读取这些流应该是通过NSThread、NSOperation或其他线程机制从应用程序强制进入后台的内容

例如:

在此NSInputStream中的任何文件中进行分层:

@property (strong, nonatomic) NSInvocationOperation *parseOp; 

(id)startInputRead:(NSInputStream *)input {
    if([input hasBytesAvailable]) {
        self.parseOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(readAndStoreInput:) object:inputStream];

    }
你的读者是这样的:

(void)readAndStoreInput:(NSInputSteam*) input{
     //process your input steam into your system in the background

}

这是一个简短的示例,说明了如何为输入端执行此操作。您还可以以类似的方式为输出蒸汽排队。这将使所有内容同时运行,并且您的应用程序保持响应。

它实际上是在线程中调度还是只是阻塞?如果只是阻塞,您可以对函数调用使用NSInvocationOperation使其不阻塞。@heckman我不确定是否理解您的问题。我正在接收NSInputStream和NSOutputStream。当我收到它们时,它们的状态都为NSStreamStatusOpen。在我开始发送东西之前,流上没有流量,所以它们实际上处于停滞状态。在主线程上,它们将在接收/服务委托消息时创建阻塞情况。Hi。但是苹果的文档说,“你永远不应该试图从一个与拥有流的运行循环不同的线程访问一个调度流。”我认为这个响应中的代码对于NSStream从何处读取是线程无关的。苹果的文档似乎很清楚这是一个禁忌。@xyzycoder你在执行scheduleInRun循环吗?没有理由不能将清单1中的所有代码都放在后台子流程中。流以NSStreamStatusOpen的状态向我走来。流构造过程是alloc/init,设置委托,在运行循环中调度,然后打开。所以,当我收到它的时候,计划就设置好了。考虑到这一点,你能不能快速地读/写它,然后在后台排队处理这些信息?这样,您就不会阻塞主线程来处理它,而是能够正确地维护调度循环。