Пользовательский интерфейс не обновлен из-за NSOperationQueue waitUntilFinished YES - PullRequest
0 голосов
/ 17 марта 2012

У меня проблема. Сценарий таков: я получил NSOperationQueue, который содержит различные NSOperationQueue, которым нужно waitUntilDone: YES. И мне нужно обновить интерфейс также, когда очередь или операция выполняется. Как лучше всего справиться с этой ситуацией?

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

- (void)loadPreviewPageWithMagazineID:(NSString *)magazineID userID:(NSString *)userID {
NSMutableArray *operationArray = [NSMutableArray array];
for (NSInteger i = 1; i <= _numTotalPages; ++i) {
    //NSLog(@"currenpage = %d, index = %d",_selectedPage,pageIndex);
    NSDictionary *arguments = [NSDictionary dictionaryWithObjectsAndKeys:magazineID, 
                               @"itemID", userID, @"userID", [NSNumber numberWithInt:i],
                               @"pageNumber", nil];
    AFOperation *imageOperation = 
        [[AFOperation alloc] initWithTarget:self 
                                   selector:@selector(savePageToDisk:) 
                                     object:arguments];
    [imageOperation addObserver:self forKeyPath:@"isFinished" options:0 context:nil];
    [imageOperation setUserInfo:arguments];
    [operationArray addObject:imageOperation];
    [imageOperation release];
}
[_imageQueue addOperations:operationArray waitUntilFinished:YES];
}


- (void)processingMagazine:(NSDictionary *)arguments {
// load pdf document from decrypted data 
NSString *userID = [arguments objectForKey:@"userID"];
NSString *magazineID = [arguments objectForKey:@"itemID"];

[self loadPreviewPageWithMagazineID:magazineID userID:userID];
}

Так что каждый раз, чтобы обновить интерфейс, мне нужно позвонить

[_collectionCoverView performSelectorOnMainThread:@selector(setDownloadProgress:)
                                       withObject:[NSNumber numberWithFloat:progress] 
                                    waitUntilDone:YES];

Is there any appropriate way to handle the UI?

1 Ответ

0 голосов
/ 17 марта 2012

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

Также обычно обновление пользовательского интерфейса происходит в MainThread.Так что нет ничего плохого в вызове executeSelectorInMainThread.

...