проблемы блокировки и синхронизации - PullRequest
0 голосов
/ 14 октября 2011

У меня есть следующий метод:

-(void)populateSpotVenueIndex
{
     @synchronized(self.spotsResults) {
    [self.pollVenueIndex removeAllObjects];
    for (PFObject * poll in self.spotsResults)
    {
        NSString * venue =  [((PFObject *)[poll objectForKey:@"parent"]) objectForKey:@"name"];
        [self.pollVenueIndex setObject:venue forKey:[poll objectForKey:@"question"]];
        dispatch_async(dispatch_get_main_queue(), ^{
          [self.tableView reloadData];
        });
    }
}

}

, который дает мне:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x3ec0d0> was mutated while being enumerated.'
*** First throw call stack:
(0x328fc8bf 0x367661e5 0x328fc3e3 0x80eb 0x8787 0x371aed55 0x371ba7a3 0x36e221cf 0x36e220a4)

Как это вообще возможно?В основном, чего я хочу достичь, так это того, что если цикл все еще выполняется и вызывается этот populateSpotVenueIndex, я просто хотел отменить этот цикл .. Есть ли такой способ сделать это?

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Я сомневаюсь, что это как-то связано с потоками или синхронизацией. Это просто означает, что вы пытались сделать что-то внутри цикла, которое изменило содержимое массива, например addObject или removeObject.

Разместите код для тела цикла, если это не приведет вас к решению.

0 голосов
/ 14 октября 2011

Вы уверены, что везде, где вы изменяете self.spotsResults, вы также используете @synchronized (self.spotsResults)? Особенно если вы измените его в любом коде, который вызывается из reloadData (например, cellForRowAtIndexPath). Было бы необычно, я бы подумал изменить массив в reloadData, но это мое предположение.

0 голосов
/ 14 октября 2011

Коллекция <__ NSArrayM: 0x3ec0d0> была видоизменена при перечислении

Это означает, что вы изменяете данные коллекций во время перечисления.

Я не вижу, как вы напрямую меняете spotResults внутри цикла.Возможно ли, что это косвенно изменяется в результате tableView reloadData в одном из обратных вызовов tableView?

Кроме того, зачем обновлять представление таблицы внутри цикла?Обновите ваши данные в цикле, а затем вызовите reloadData ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...