FTP-файл с использованием асинхронного вызова метода в приложении iPhone - PullRequest
2 голосов
/ 03 января 2012

Я новичок в разработке приложений для iPhone. Я хочу иметь асинхронный метод, который будет вызываться при успешном входе в систему и работать асинхронно во время навигации по различным представлениям в приложении.

Этот метод должен работать независимо, не затрагивая методы основного вида. Этот метод выполняет ftp файлов из локальной папки на сервер.

Не могли бы вы сказать мне или привести пример кода, к которому я могу обратиться. Я хочу видеть процессы ftp и async.

1 Ответ

1 голос
/ 06 февраля 2012

насколько я понимаю, вы хотите загрузить что-то с iphone на сервер в фоновом потоке?тем не мение;загрузка в фоновом потоке должна быть очень похожей.

Во-первых, я предлагаю вам создать метод, который выполняет основную работу за вас:

- (void) createRessource {

    NSURL *destinationDirURL = [NSURL URLWithString: completePathToTheFileYouWantToUpload];

    CFWriteStreamRef writeStreamRef = CFWriteStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) destinationDirURL);

    ftpStream = (__bridge_transfer NSOutputStream *) writeStreamRef;
    BOOL success = [ftpStream setProperty: yourFTPUser forKey: (id)kCFStreamPropertyFTPUserName];
    if (success) {
        NSLog(@"\tsuccessfully set the user name");
    }
    success = [ftpStream setProperty: passwdForYourFTPUser forKey: (id)kCFStreamPropertyFTPPassword];
    if (success) {
        NSLog(@"\tsuccessfully set the password");
    }

    ftpStream.delegate = self;
    [ftpStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    // open stream
    [ftpStream open];
}

Этот метод составляет одну треть работы:это будет называться в фоновом режиме.Вызывается из чего-то вроде этого:

- (void) backgroundTask {

    NSError *error;

    done = FALSE;
    /* 
     only 'prepares' the stream for upload 
     - doesn't actually upload anything until the runloop of this background thread is run!
     */
    [self createRessource];

    NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];

    do {

        if(![currentRunLoop runMode: NSDefaultRunLoopMode beforeDate: [NSDate distantFuture]]) {

            // log error if the runloop invocation failed
            error = [[NSError alloc] initWithDomain: @"org.yourDomain.FTPUpload" 
                                               code: 23 
                                           userInfo: nil];
        }

    } while (!done && !error);

    // close stream, remove from runloop
    [ftpStream close];
    [ftpStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode];

    if (error) {
        // handle error
    }

    /* if you want to upload more: put the above code in a lopp or upload the next ressource here or something like that */
}

Теперь вы можете вызвать

[self performSelectorInBackground: @selector(backgroundTask) withObject: nil];

, и для вас будет создан фоновый поток, поток будет запланирован в цикле выполнения, а цикл запуска -настроен и запущен.

Наиболее важным является запуск runloop в фоновом потоке - без него реализация потока никогда не начнет работать ...

в основном взято отсюда, где я имеланалогичное задание для выполнения: загрузка файлов в фоновом режиме через ftp на iphone

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...