У меня есть приложение для iPhone, где на загрузке контроллера представления, я хочу назвать веб-сервис, получить и проанализировать XML все на фоновом потоке. Затем обновите ui после того, как поток сделан, затем исчерпайте другой поток, чтобы сделать secondard операцию в другом фоновом потоке.
Вид подобных вызовов поточной обработки объединения в цепочку:
Все на загрузке приложения.
Проблема - то, что мое первое, операция Потока 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
Здесь вы вызываете метод в основном потоке, который ожидает завершения вызываемого метода ( waitUntilDone: YES
):
[self performSelectorOnMainThread:@selector(invokeRefreshAfterLoadingFriends:)
withObject:nil
waitUntilDone:YES];
Затем вы вызываете -invokeRefreshAfterLoadingFriends:
, который удерживает основной поток до завершения операции, поэтому метод никогда не будет «выполнен». Из документации для -waitUntilAllOperationsAreFinished
:
При вызове этот метод блокирует текущий поток и ожидает завершения выполнения текущих операций получателя и операций в очереди.
В результате метод операции -invokeLoadingOfFriends:
ожидает завершения метода основного потока, чего никогда не происходит, потому что вы задержали основной поток с помощью [queue waitUntilAllOperationsAreFinished]
.
Попробуйте установить waitUntilDone
на NO
и посмотрите, поможет ли это завершить операцию.