Iphone 如何等待ftp请求完成,然后继续程序
我使用“SimpleFTPSample”执行ftp请求,以列出derictory信息。部分守则如下:Iphone 如何等待ftp请求完成,然后继续程序,iphone,objective-c,multithreading,Iphone,Objective C,Multithreading,我使用“SimpleFTPSample”执行ftp请求,以列出derictory信息。部分守则如下: - (void)_startReceive { ...... self.networkStream = (NSInputStream *) ftpStream; self.networkStream.delegate = self; [self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forM
- (void)_startReceive
{
......
self.networkStream = (NSInputStream *) ftpStream;
self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[NSTimer scheduledTimerWithTimeInterval:TIMEOUTFTP target:self
selector:@selector(dealTimeOut:) userInfo:nil repeats:NO];
......
}
我还设置了一个NSTimer在TimeOuttp之后停止networkStream,如果请求在我定义的TimeOuttp内正确完成,networkStream也将关闭。我在另一个地方使用这种方法,比如:
- (void)downLoadData
{
NSArray* receivedData;
[ftpService _startReceive];
//wait until the network is closed
while (ftpService.isReceiving) {}
receivedData = ftpService.dataArray;
if([receivedData count] == 0) {
NSLog(@"no data get");
}
else {
NSLog(@"get data number %d", [receivedData count]);
}
}
情况是程序停留在“while(ftpService.isReceiving){}”。我不熟悉多线程。可能是我没有正确理解运行循环。有人能告诉我为什么会这样,以及如何达到我的目的吗 在让程序继续之前,您应该重新考虑是否确实要等待收到的数据。相反,你应该让你的UI进入一种状态,显示它正在下载并限制用户可以做什么,将控制权返回到应用程序的主事件循环,并让它在收到数据时调用你的委托方法。只有在收到数据后,才应解锁UI并继续执行下一步,不管是什么 阻塞应用程序的主线程将导致用户体验不佳,并可能导致应用程序终止 但是,如果确实要这样做,则需要运行run循环,而不是进行繁忙的等待。比如:
while (ftpService.isReceiving)
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
实际上,在您自己运行运行循环的情况下,您应该在此处和计划流的位置使用不同的运行循环模式。默认运行循环模式将包含来自其余框架的运行循环源,让这些源从您自己的内部运行循环触发是危险的。只需使用一个任意字符串,该字符串可能是该模式下程序的唯一字符串
运行循环是各种事件源和输入(以及计时器)的集合。您的代码和框架的各个部分都将在运行循环中调度源代码。它们依赖于正在运行的运行循环,以便接收事件/输入/计时器触发并处理它们。由于没有运行运行循环,只是忙于等待,您阻止了流从FTP连接接收数据并进行处理。谢谢!你的密码是做单词的。但是我不明白你想告诉我什么。我想我应该更多地了解运行循环。实际上,这是从服务器加载数据的第二个线程。这样做会导致糟糕的结果吗?在后台线程上,阻塞等待数据是可以的。你可以使用我展示的代码。(通常不需要使用单独的线程,因为API支持异步使用,但这没关系。)如果您想了解有关运行循环的更多信息,请参阅。异步使用是什么?你是说“性能选择器”吗?如果我使用GCD呢?异步使用是我在回答的开头所描述的,在这里,您不会阻止等待接收响应,而是允许程序继续。