崩溃 - “Collection 在枚举时发生了变化。”
目标是“在启动viewWillAppear时启动spinner图形,在显示tableview之前加载数据”,所以用户不会疑惑为什么在查看表格之前会有延迟。即一个UIActivityIndicatorView已被添加到窗口中,我只是想设置alpha来隐藏/显示它。崩溃 - “Collection <CALayerArray:0x645dfc0>在枚举时发生了变化。”
我启动一个线程时,确保“旋转齿轮” ImageView的(标记= 333)被所示,移动到中加载/ viewWillAppear中计算的东西之前得到这个奇怪的错误。
我不明白这一点在每次调用[appdel addGearz]和[appdel removeGearz],它发生了这两个,这是随机的。它可能发生在2个viewWillAppears之后,或15个之后。如果我注释掉设置alpha的那一行,那么所有东西都可以工作。
一个典型的viewWillAppear中看起来像这样,
[super viewWillappear];
[email protected]"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
这里是崩溃,如果与阿尔法行没有被注释掉
-(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的alpha?我是否需要在某些“停止枚举而我更改此代码”中“嵌入”alpha-change?
我做到了不通过移动字母更改线上面的池页头或低于[池排水]崩溃,但后来我得到了很多的“有没有到位池自动释放 - 只是跑冒滴漏” -messages 。
显然,我不明白这个线程代码。
您不能尝试在单独的线程上修改UI。应该只在主线程上操作UI。
相反拆卸一个新的线程,你应该使用performSelectorOnMainThread:withObject:waitUntilDone:
。这将确保该方法将在正确的线程上被调用。
[自performSelectorOnMainThread:@selector(gearzOn)withObject:无waitUntilDone:YES];不会立即更新可见性,这是整个想法 - 因为viewWillAppear将在推送视图之前完成所有加载操作,所以用户应该知道发生了什么。 – 2011-01-21 12:20:11