Iphone 如何等待ftp请求完成,然后继续程序

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

我使用“SimpleFTPSample”执行ftp请求,以列出derictory信息。部分守则如下:

- (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呢?异步使用是我在回答的开头所描述的,在这里,您不会阻止等待接收响应,而是允许程序继续。