Сбой - "Коллекция <CALayerArray: 0x645dfc0> была видоизменена при перечислении." - PullRequest
7 голосов
/ 21 января 2011

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

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

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

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

[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 в потоке? Нужно ли мне "встраивать" альфа-изменение в какой-нибудь код "прекратить перечислять, пока я меняю"?

Я сделал это не сбоем, переместив эту строку альфа-изменения выше выделенного пула или под [сток стока], но затем я получаю много «автоматически выпущенных без пула на месте - просто утечка» - сообщений.

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

1 Ответ

8 голосов
/ 21 января 2011

Вы не должны пытаться изменить пользовательский интерфейс в отдельном потоке.Пользовательским интерфейсом следует манипулировать только в основном потоке.

Вместо отсоединения нового потока следует использовать performSelectorOnMainThread:withObject:waitUntilDone:.Это обеспечит вызов метода в соответствующем потоке.

...