Я нашел / создал решение, которое по крайней мере работает для меня.При использовании вышеуказанного метода ( createRemoteDir ) для меня был применен и работал следующий код:
NSError *error;
createdDirectory = FALSE;
/*
only 'prepares' the stream for upload
- doesn't actually upload anything until the runloop of this background thread is run
*/
[self createRemoteDir];
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
do {
if(![currentRunLoop runMode: NSDefaultRunLoopMode beforeDate: [NSDate distantFuture]]) {
// log error if the runloop invocation failed
error = [[NSError alloc] initWithDomain: @"org.mJae.FTPUploadTrial"
code: 23
userInfo: nil];
}
} while (!createdDirectory && !error);
// close stream, remove from runloop
[ftpStream close];
[ftpStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode];
if (error) {
// handle error
}
Он запускается в фоновом потоке и создает каталог на сервере ftp.Мне это нравится больше, чем в других примерах, когда циклы выполнения запускаются только для предполагаемого небольшого интервала, скажем, 1 секунда.
[NSDate distantFuture]
- это дата в будущем (несколько столетий, согласно документации Apple).Но это хорошо, поскольку «условие прерывания» обрабатывается моим свойством класса createDirectory - или возникновением ошибки при запуске runloop.
Я не могу объяснить, почему это работает безЯ явно присоединяю входной источник к циклу выполнения (NSTimer или NSPort), но я предполагаю, что достаточно, чтобы NSOutputStream был запланирован в цикле выполнения фонового потока (см. createRemoteDir ).