アプリ内でFTP接続を確立しようとしています。FTPサーバーに複数のファイルをアップロードしたいのですが、すべてのファイルが1つのディレクトリにあります。だから最初に私はリモートディレクトリを作成したいと思います。
- (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];
私の推測では、(background-threads)runloopが実行されていませんか?メインスレッド内でメッセージを送信すると、アップロードは正常に機能します。
[self createRemoteDir];
メインスレッドのrunloopが稼働しているため。
ただし、かなり大きなファイルがアップロードされます。そのため、そのワークロードをバックグラウンドスレッドに配置したいと思います。しかし、アップロード全体がバックグラウンドスレッドで行われるように、NSRunLoopをどこでどのように設定すればよいですか?NSRunLoopsに関するAppleのドキュメント(特に、この場合のように、タイマー/入力ソースを使用せずにそれらを起動する方法)は私を助けませんでした。