Единственное, что я делаю:Как узнать, закончилось ли задание, требующее многопоточности?
-(void)GrabbingProcess:(void (^)())block;
{
self.OtherGrabbingIndicator +=1;
block();
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
self.OtherGrabbingIndicator -=1;
});
}
Everytime Я хочу, чтобы запустить что-то, что может занять длительное время в фоновом режиме, я что-то вроде
[Grabclass грейфером] GrabbingProcess:^{ // Сделайте что-нибудь захват данных и т. Д. }];
Есть много таких функций и многие такие данные. Например, сначала я бы захватил все идентификаторы предприятий. Тогда я бы захватил все детали на предприятиях в отдельной теме.
Я хочу знать время, когда ВСЕ эти потоки закончили и разместит соответствующее уведомление.
Проблема с моим решением заключается в том, что через некоторое время, довольно часто значение self.OtherGrabbingIndicator вращается вокруг 2 или 3, никогда не спускаясь, хотя все эти потоки закончены.
Каким-то образом некоторые из себя. ДругГрабингИндикатор + = 1; «просочился» и не совпадал с самим собой. ДругГрабингИндикатор - = 1. Интересно, как эта утечка может произойти?
Никогда * никогда * используйте 'dispatch_get_current_queue()'. Это функция отладки и не подходит для использования в коде. –
Спасибо. Вы можете это сделать? –
См. Справочную страницу. В разделе «CAVEATS» говорится, что эта функция предназначена только для целей отладки/ведения журнала. Более конкретно, эта функция возвращает только верхушку текущей иерархии очередей, которая может быть чужой частной очередью. –