崩溃 - “Collection 在枚举时发生了变化。”

问题描述:

目标是“在启动viewWillAppear时启动spinner图形,在显示tableview之前加载数据”,所以用户不会疑惑为什么在查看表格之前会有延迟。即一个UIActivityIndi​​catorView已被添加到窗口中,我只是想设置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:。这将确保该方法将在正确的线程上被调用。

+0

[自performSelectorOnMainThread:@selector(gearzOn)withObject:无waitUntilDone:YES];不会立即更新可见性,这是​​整个想法 - 因为viewWillAppear将在推送视图之前完成所有加载操作,所以用户应该知道发生了什么。 – 2011-01-21 12:20:11