Hen*_*son 7 iphone enumeration calayer nsthread nsautoreleasepool
目标是"在viewWillAppear开始时启动一个微调器图形,在显示tableview之前加载数据",这样用户就不会想知道为什么在看到表之前会有延迟.即UIActivityIndicatorView已被添加到窗口中,我只想设置alpha来隐藏/显示它.
在启动一个线程以确保显示"旋转齿轮"imageview(tag = 333)之前,我得到了这个奇怪的错误,然后继续加载/计算viewWillAppear中的东西.
我不会在每次调用[appdel addGearz]和[appdel removeGearz]时都知道它,这两种情况都会发生,而且它是随机的.它可能发生在2个viewWillAppears之后,或15之后.如果我注释掉设置alpha的行,一切正常.
一个典型的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
Run Code Online (Sandbox Code Playgroud)
如果带有.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];
}
Run Code Online (Sandbox Code Playgroud)
我已经使用了别人的代码,所以......你能看到什么明显的东西?当然我必须能够在线程中更改UIViews的alpha吗?我是否需要在某些"停止枚举,而我更改此"代码中"嵌入"alpha变化?
我通过将alpha-change-line移动到池alloc之上或者[pool drain]之下来使它没有崩溃,但后来我得到了很多"自动释放没有池到位 - 只是泄漏" - 消息.
显然,我对这个线程代码有些不了解.
您不得尝试在单独的线程上修改UI.UI应该只在主线程上操作.
您应该使用而不是分离新线程performSelectorOnMainThread:withObject:waitUntilDone:.这将确保在适当的线程上调用该方法.
| 归档时间: |
|
| 查看次数: |
5913 次 |
| 最近记录: |