我正在尝试在应用程序中建立 FTP 连接。我想将几个文件上传到 FTP 服务器,所有文件都在一个目录中。所以首先我想创建远程目录。
- (void) createRemoteDir {
NSURL *destinationDirURL = [NSURL URLWithString: uploadDir];
CFWriteStreamRef writeStreamRef = CFWriteStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) destinationDirURL);
assert(writeStreamRef != NULL);
ftpStream = (__bridge_transfer NSOutputStream *) writeStreamRef;
BOOL success = [ftpStream setProperty: ftpUser forKey: (id)kCFStreamPropertyFTPUserName];
if (success) {
NSLog(@"\tsuccessfully set the user name");
}
success = [ftpStream setProperty: ftpPass forKey: (id)kCFStreamPropertyFTPPassword];
if (success) {
NSLog(@"\tsuccessfully set the password");
}
ftpStream.delegate = self;
[ftpStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
// open stream
[ftpStream open];
}
此代码在使用以下调用在后台线程中执行时不起作用:
[self performSelectorInBackground: @selector(createRemoteDir) withObject: nil];
我的猜测是(后台线程)运行循环没有运行?如果我在主线程内发送消息,则上传工作正常:
[self createRemoteDir];
由于主线程的运行循环已启动并正在运行。
但是要上传相当大的文件;所以我想把这个工作量放在后台线程中。但是我如何以及在哪里设置 NSRunLoop,以便整个上传发生在后台线程中?苹果关于 NSRunLoops 的文档(尤其是如何在不使用计时器/输入源的情况下启动它们,如本例)并没有帮助我。