Crash - "Collection was mutated while being enumerated."

Цель - "запустить в начале viewWillAppear графический спиннер, который загружает данные перед показом таблицы", чтобы пользователь не удивлялся, почему происходит задержка перед просмотром таблицы. Т.е. UIActivityIndicatorView был добавлен в окно, и я просто хочу установить альфу, чтобы скрыть/показать его.

Я получаю эту странную ошибку при запуске потока, чтобы убедиться, что изображение "вращающихся шестеренок" (tag=333) будет показано, прежде чем перейти к загрузке/расчету материала в viewWillAppear.

Я не получаю это при каждом вызове [appdel addGearz] и [appdel removeGearz], это происходит в обоих случаях, и это случайно. Это может произойти после 2 viewWillAppears или после 15. Если я закомментирую строку, которая устанавливает альфу, все работает.

Типичный viewWillAppear выглядит примерно так,

[super viewWillappear];
self.title=@"Products listing"; //and other simple things
[appdel addGearz];
[self getProducts];
[self getThumbnails];
[myTableView reloadData]; //in case view already loaded and coming back from subview and data changed

А вот код, который падает, если строки с .alpha не закомментированы

-(void)addGearz {
    [NSThread detachNewThreadSelector:@selector(gearzOn) toTarget:self withObject:nil];
}

-(void)removeGearz {
    [NSThread detachNewThreadSelector:@selector(gearzOff) toTarget:self withObject:nil];
}

- (void)gearzOn {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [window viewWithTag:333].alpha=1.0;
        //
        //  [[window viewWithTag:333] setNeedsDisplay];
    [pool drain];
}

- (void) gearzOff {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [window viewWithTag:333].alpha=0.0;
        //
        //  [[window viewWithTag:333] setNeedsDisplay];
    [pool drain];
}

Я использовал чужой код, так что... что-нибудь очевидное вы можете увидеть? Конечно, я должен иметь возможность изменять альфу UIViews в потоке? Нужно ли мне "встраивать" изменение альфа-канала в какой-то "stop enumerating while I change this"-код?

Я заставил его не падать, переместив линию изменения альфа-канала выше выделения бассейна или ниже [слива бассейна], но тогда я получаю много "autoreleased with no pool in place - just leaking"-сообщений.

Видимо, я чего-то не понимаю в этом коде потока.

7
задан Henrik Erlandsson 21 January 2011 в 10:36
поделиться