Очередь NSOperationQueue waitUntilAllOperationsAreFinished зависает

У меня есть приложение для iPhone, где на загрузке контроллера представления, я хочу назвать веб-сервис, получить и проанализировать XML все на фоновом потоке. Затем обновите ui после того, как поток сделан, затем исчерпайте другой поток, чтобы сделать secondard операцию в другом фоновом потоке.

Вид подобных вызовов поточной обработки объединения в цепочку:

  1. Поток UI-> Создает Поток BG
  2. Поток BG-> Вызов сервис XML и получает результаты
  3. Поток UI-> Обновление UI успеха операции Потока BG
  4. Поток BG-> Исчерпывает часть 2 операции

Все на загрузке приложения.

Проблема - то, что мое первое, операция Потока BG никогда, кажется, не заканчивается. Я добавил в a waitUntilAllOperationsAreFinished звоните после того, как шаг 2 сделан, только для наблюдения то, что продолжается, и мое приложение никогда, кажется, не заканчивает ту точку.

Это - вид основной скелетной реализации:

- (void) viewDidLoad 
{
    queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];

    //other stuff

    [self loadFriendsInBackgroundThread];
}

- (void) loadFriendsInBackgroundThread
{   
    NSInvocationOperation *operation = [NSInvocationOperation alloc];
    operation = [operation initWithTarget:self selector:@selector(invokeLoadingOfFriends:) object: nil];

    [queue addOperation:operation];
[operation release];
}

- (void) invokeLoadingOfFriends: (id) obj
{
    //webservice calls and results

    [self performSelectorOnMainThread:@selector(invokeRefreshAfterLoadingFriends:) 
                       withObject:nil 
                    waitUntilDone:YES];
}

- (void) invokeRefreshAfterLoadingFriends: (id) obj
{
    //this line is where is hangs
    [queue waitUntilAllOperationsAreFinished];

    //never gets here
    [self refresh: NO];
}

Какие-либо идеи относительно того, почему первый вызов потока никогда, кажется, не заканчивается?

Спасибо за любую справку можно дать Mark

1
задан Mark 29 July 2010 в 10:20
поделиться

1 ответ

Здесь вы вызываете метод в основном потоке, который ожидает завершения вызываемого метода ( waitUntilDone: YES ):

[self performSelectorOnMainThread:@selector(invokeRefreshAfterLoadingFriends:) 
                   withObject:nil 
                waitUntilDone:YES];

Затем вы вызываете -invokeRefreshAfterLoadingFriends: , который удерживает основной поток до завершения операции, поэтому метод никогда не будет «выполнен». Из документации для -waitUntilAllOperationsAreFinished :

При вызове этот метод блокирует текущий поток и ожидает завершения выполнения текущих операций получателя и операций в очереди.

В результате метод операции -invokeLoadingOfFriends: ожидает завершения метода основного потока, чего никогда не происходит, потому что вы задержали основной поток с помощью [queue waitUntilAllOperationsAreFinished] .

Попробуйте установить waitUntilDone на NO и посмотрите, поможет ли это завершить операцию.

2
ответ дан 2 September 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: