-(void)GrabbingProcess:(void (^)())block;
{
AssertNonMainThread;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (self.OtherGrabbingIndicator == 0)
{
self.isStillLoading = true;
}
self.OtherGrabbingIndicator ++;
AssertMainThread
}];
block();
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self updateStatusAtList];
self.OtherGrabbingIndicator --;
if (self.OtherGrabbingIndicator ==0)
{
self.isStillLoading = false;
}
AssertMainThread
}];
}
В принципе, код настроен так, что self.OtherGrabbingIndicator ++ всегда будет уравновешиваться self.OtherGrabbingIndicator--Как я могу исправить такую ошибку
Я не мог придумать какой-либо причине, почему это потерпит неудачу. Он не используется для отказа.
Теперь время от времени оно терпит неудачу. self.OtherGrabbingIndicator будет парить на 2 или 1, и все потоки прекратятся. Почему-то некоторые ++ не сбалансированы. но как это может быть?
Я понятия не имею, как.
Я проверил вокруг, что нет возможности self.OtherGrabbingIndicator изменен где-нибудь еще.
Одна вещь, которую я планирую сделать, это добавить значение блока в некоторый массив и соответствующим образом удалить эти блоки. Проблема в том, что я знаю блок, как я узнаю, какой код, который блокирует, представляет?
Он работал нормально, и теперь это не так. Это сводит меня с ума.
Единственный способ, о котором я могу думать, это то, что каким-то образом блок() не может завершить, но какой блок не завершится и как это может произойти?
Если я нажимаю паузу, все потоки пусты.
Обновление: добавление @synchronized() в ++ и - решает проблему. Однако это НЕ имеет смысла.
Он должен работать без @синхронизированного, потому что mainQueue имеет только 1 максимум потока и выполняет вещи по одному.
Комментариев нет только downvotes. Что за чертовщина? Да, это сложная проблема. Я много пробовал. Я просто не могу думать о какой-либо причине, почему код может потерпеть неудачу. Это очень простой код. –