Проблема с использованием dispatch_async, не может запустить два вызова функций на одном контроллере?

У меня есть следующий метод в моем AppDelegate. Я не могу найти способ обновить метку на updateView и выполнить загрузку через ASIHTTPRequest. В приведенном ниже коде он выполнит загрузку (startUpload), но не обновит метку (updateLabel). Если я закомментирую вызов startUpload, он обновит метку. Я также попытался создать очередь отправки в uploadViewController, и это дало аналогичный результат, когда я мог заставить работать только один из двух методов.

- (void) showProgressView:(NSString *)filePath {
    NSView *view = [uploadViewController view];
    dispatch_queue_t queue = dispatch_get_global_queue(0,0);
    dispatch_async(queue, ^{
        // assigns the upload view to the root NSPanel
        [box setContentView:view];
    });
    dispatch_async(queue, ^{
        // starts the upload using ASIHTTPRequest
        [uploadViewController startUpload:filePath];
    });
    dispatch_async(queue, ^{
        // updates a label in the upload view
        [uploadViewController updateLabel];
    });
}

В UploadViewController:

-(void)startUpload:(NSString *)filePath {
    HandZipper *handZipper = [HandZipper alloc];
    zipPath = [handZipper compressHands:(filePath):(processStatus)];   

    ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:@"http://allseeing-i.com/ignore"]] autorelease];

    [request setRequestMethod:@"PUT"];
    [request setPostBodyFilePath:zipPath];
    [request setShouldStreamPostDataFromDisk:YES];
    [request setDelegate:self];
    [request setUploadProgressDelegate:progressIndicator];
    [request setDidFinishSelector:@selector(postFinished:)];
    [request setDidFailSelector:@selector(postFailed:)];
    [request startSynchronous]; 

}

1 ответ

Решение

Вы должны всегда обновлять элементы интерфейса в главном потоке. Если вы знаете, что showProgressView: будет вызван из основного потока, затем удалите dispatch_async со всего [box setContentView:view]; а также [uploadViewController updateLabel]; и просто позвоните им напрямую. В противном случае, если showProgressView: может быть вызван из другого потока, то просто используйте dispatch_get_main_queue(void) вместо queue,

Другие вопросы по тегам