2012-03-28 75 views
2

我在iPhone上实现了一个FTP客户端,但是当正在进行从FTP服务器下载的连接时,连接中断了一段时间,应用程序通知我没有连接并停止客户端。如何处理使用CFNetwork的iOS上的互联网连接中断?

这里谈到的问题:下一次我尝试再次启动下载过程,事件stream:handleEvent:不点火,networkStream住宿的上NSStreamStatusOpeningstreamStatus

如果我手动停止下载过程(使用连接中断时触发的相同方法),我可以再次重新下载。我必须重新启动整个应用程序才能再次下载。

这里是代码的关键部分:当事情与流

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode { 
    switch (eventCode) { 
    case NSStreamEventOpenCompleted: { 
     [self updateStatus:@"Opened connection"]; 
    } break; 
    case NSStreamEventHasBytesAvailable: { 
     NSInteger  bytesRead; 
     uint8_t   buffer[32768]; 
     bytesRead = [self.networkStream read:buffer maxLength:sizeof(buffer)]; 
     if (bytesRead == -1) { 
      [self stopReceivingWithStatus:@"Network read error"]; 
     } else if (bytesRead == 0) { 
      [self stopReceivingWithStatus:nil]; 
     } else { 
      [self processStreamDataWithBuffer:buffer andReadBytes:bytesRead]; 
     } 
    } break; 
    case NSStreamEventHasSpaceAvailable: { 
     assert(NO); 
    } break; 
    case NSStreamEventErrorOccurred: { 
     [self stopReceivingWithStatus:@"Stream open error"]; 
    } break; 
    case NSStreamEventEndEncountered: { 
    } break; 
    default: { 
     assert(NO); 
    } break; 
} 

的问题发生,因为我说的是被激发

- (void)downloadFile:(NSDictionary *)file { 
    NSURL *url; 
    CFReadStreamRef ftpStream; 
    url = [NSURL URLWithString:[@"PATH TO FTP FILE" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    [self.fileStream open]; 
    ftpStream = CFReadStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) url); 
    self.networkStream = (__bridge NSInputStream *) ftpStream; 
    self.networkStream.delegate = self; 
    [self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.networkStream open]; 
    CFRelease(ftpStream); 
} 

和方法,经过连接中断,事件不再被解雇。

注:我正在使用iOS 5与ARC。

回答

2

也许你应该设置标志来强制流关闭默认没有完成的底层本地套接字;

[self.networkStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];