Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.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
iOS如何执行多个NSInputStream_Ios_Nsthread_Nsstream_Nsinputstream_Nsoutputstream - Fatal编程技术网

iOS如何执行多个NSInputStream

iOS如何执行多个NSInputStream,ios,nsthread,nsstream,nsinputstream,nsoutputstream,Ios,Nsthread,Nsstream,Nsinputstream,Nsoutputstream,我的应用程序使用NSInputStream,如下所示: inputStream.delegate = self; [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [readStream open]; 和代表: - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamE

我的应用程序使用NSInputStream,如下所示:

inputStream.delegate = self;
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [readStream open];
和代表:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
它工作得很好,但我所做的所有其他请求都会排队,直到第一个请求完成。 我可以一次做一个,但没有办法做多个并发请求

有解决办法吗? 多谢各位

此解决方案不适用于我:

更新:
Was我的服务器无法处理来自同一个源的多个连接。

您需要在单独的线程中创建流,以使它们能够同时工作。我假设您有一个方法可以设置您提到的inputStream:

- (void)openStreamInNewThread {
    [NSThread detachNewThreadSelector:@selector(openStream) toTarget:self withObject:nil];
}

- (void)openStream {
    NSInputStream *inputStream;

    // stream  setup

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                   forMode:NSRunLoopCommonModes];
}

请注意,
[nsrunlop currentlunloop]
将返回当前线程的runloop。因此,新创建的流在一个单独的线程中运行,并与其他流在各自的线程中同时加载数据。

您需要在单独的线程中创建流,以使它们能够同时工作。我假设您有一个方法可以设置您提到的inputStream:

- (void)openStreamInNewThread {
    [NSThread detachNewThreadSelector:@selector(openStream) toTarget:self withObject:nil];
}

- (void)openStream {
    NSInputStream *inputStream;

    // stream  setup

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                   forMode:NSRunLoopCommonModes];
}

请注意,
[nsrunlop currentlunloop]
将返回当前线程的runloop。因此,您可以让新创建的流在一个单独的线程中运行,并与其他流在各自的线程中同时加载数据。

您可以尝试在各自的运行循环中调度每个流。下面是一个从类设计到单元测试my的改进方法:

static const NSTimeInterval krunlopcycleinterval=0.01f;
静态常数uint64_t kDispatchDeltaNanoSec=250000000;
-(POSRunLoopResult)启动nsrunloopWithStream:(NSInputStream*)流委托:(id)streamDelegate{
stream.delegate=streamDelegate;
__block BOOL breakRunLoop=否;
__块调度\u信号量\u t doneSemaphore=dispatch\u信号量\u create(0);
调度异步(调度获取全局队列(调度队列优先级默认为0)^{
NSRunLoop*runLoop=[NSRunLoop currentlunloop];
[流调度InRunLoop:runLoop forMode:NSDefaultRunLoopMode];
如果([streamStatus]==NSStreamStatusNoOpen){
NSLog(@“%@:正在打开流…”,[NSThread currentThread]);
[溪流开放];
}
而([runLoop运行模式:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:kRunLoopCycleInterval]&&!breakRunLoop)
{}
NSLog(@“%@:我们完成了!”,[NSThread currentThread]);
调度信号灯(doneSemaphore);
});
POSRunLoopResult=dispatch_信号量_wait(doneSemaphore,dispatch_time_NOW,KDDispatchDeltananosec))==0?PosrunloopResultOne:POSRunLoopResultTimeout;
if(POSRunLoopResultTimeout==结果){
breakRunLoop=是;
调度信号灯等待(doneSemaphore,调度时间永远);
}
返回结果;
}

您可以尝试在自己的运行循环中调度每个流。下面是一个从类设计到单元测试my的改进方法:

static const NSTimeInterval krunlopcycleinterval=0.01f;
静态常数uint64_t kDispatchDeltaNanoSec=250000000;
-(POSRunLoopResult)启动nsrunloopWithStream:(NSInputStream*)流委托:(id)streamDelegate{
stream.delegate=streamDelegate;
__block BOOL breakRunLoop=否;
__块调度\u信号量\u t doneSemaphore=dispatch\u信号量\u create(0);
调度异步(调度获取全局队列(调度队列优先级默认为0)^{
NSRunLoop*runLoop=[NSRunLoop currentlunloop];
[流调度InRunLoop:runLoop forMode:NSDefaultRunLoopMode];
如果([streamStatus]==NSStreamStatusNoOpen){
NSLog(@“%@:正在打开流…”,[NSThread currentThread]);
[溪流开放];
}
而([runLoop运行模式:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:kRunLoopCycleInterval]&&!breakRunLoop)
{}
NSLog(@“%@:我们完成了!”,[NSThread currentThread]);
调度信号灯(doneSemaphore);
});
POSRunLoopResult=dispatch_信号量_wait(doneSemaphore,dispatch_time_NOW,KDDispatchDeltananosec))==0?PosrunloopResultOne:POSRunLoopResultTimeout;
if(POSRunLoopResultTimeout==结果){
breakRunLoop=是;
调度信号灯等待(doneSemaphore,调度时间永远);
}
返回结果;
}

每次创建新的NSInputStream时,我都会将其添加到块对象中,然后将块对象存储在NSMutableArray中

我发布了将视频从一个iOS流到另一个iOS的代码:

使用Xcode 11构建此应用程序;在两台iOS 11设备上运行它

触按两台设备之一上的摄像头图标可开始流式直播视频


如果你没有两台设备,你可以在模拟器中运行应用程序;但是,仅来自真实设备的流(摄影机在模拟器上不可用)。

每次创建新的NSInputStream时,我将其添加到块对象,然后将块对象存储在NSMutableArray中

我发布了将视频从一个iOS流到另一个iOS的代码:

使用Xcode 11构建此应用程序;在两台iOS 11设备上运行它

触按两台设备之一上的摄像头图标可开始流式直播视频


如果你没有两台设备,你可以在模拟器中运行应用程序;但是,仅来自真实设备的流(模拟器上没有摄像头)。

到底什么不起作用?委托方法不是全部称为ar,还是仅称为提供数据的方法?您是否尝试多次连接到同一地址和端口?当我完成第二次启动时,每次只能执行一个操作。我要下载所有NSInputStream,是的,相同的端口和相同的主机,但不是相同的ftp文件/URL您能确认您的服务器可以处理来自同一来源的多个连接吗?使用桌面ftp客户端,我可以下载多个文件,如何检查?您的桌面客户端可能使用活动FTP,它通过不同端口连接,也可以从服务器连接到客户端。看看FTP cla