2013-04-02 2 views
-2
-(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 максимум потока и выполняет вещи по одному.

+1

Комментариев нет только downvotes. Что за чертовщина? Да, это сложная проблема. Я много пробовал. Я просто не могу думать о какой-либо причине, почему код может потерпеть неудачу. Это очень простой код. –

ответ

1

К сожалению, у меня нет окончательного ответа для вас. Тем не менее, я недавно кое-что испытал с NSOperations, и я поделюсь им с вами.

Несколько вопросов о вашем коде:

первый блок в addOperationWithBlock нужно ли завершить до «блока()» вызов ча быть выполнены?

Выполняет ли второй блок выполнение обеих операций перед выполнением?

В моем случае операции, которые добавлены в правильном порядке, но на основе планирования потока рабочей очереди (которая была ниже, чем какой-либо другой поток, который требовал результата операции), они были выполнены слишком поздно и сделали код неудачным ,

Я не знаю, как критически важно время для захвата, но в моем случае использование NSOperation во время критической части моего приложения никогда не работало в 100% случаев. Поэтому я переработал для использования NSThread, из которого мы могли бы контролировать приоритет, и с тех пор все работает нормально.

Мое заключение после этого опыта заключается в том, что NSOperation - отличный инструмент, потому что он прост в использовании, но не очень помогает в критичной по времени ситуации, потому что на самом деле он не предназначен для этого случая использования.

Надеюсь, что это поможет, удачи вам.

+0

Нет, нет. Случается, что мне все равно, выполняется ли ++ до, после или одновременно с - и block(). Все, что имеет значение, для каждого ++ есть. Кроме того, поскольку mainQueue имеет только 1 параллелизм, тогда да, сначала будет выполнен ++. Это не важно. –

+0

Добавление работы, хотя. Однако это все еще не имеет смысла. Все потоки mainQueue должны быть синхронизированы даже без. –

Смежные вопросы