我使用NSOperationQueue加载UIImageView。
负载从Internet获取图像,然后将其添加到图像视图中。我遇到的问题是该方法完成但是大约需要3秒才能使图像视图实际显示图像或从超视图中删除图像视图......
- (void)viewDidLoad { NSLog(@"AirportDetailView: viewDidLoad");
[super viewDidLoad];
[self.activity startAnimating];
self.queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage) object:NULL];
[self.queue addOperation:operation];
[operation release];
}
-(void)loadImage {
[myAp ImageForAp];
NSLog(@"ImageFor Ap Ended, %@",myAp.ApDiagram);
[self.activity stopAnimating];
if (myAp.ApDiagram==NULL) {
NSLog(@"Finally Gets Here");
[self.Diagram removeFromSuperview];
}
else {
NSLog(@"Finally Gets Here with Diag");
[self.Diagram setBackgroundImage:myAp.ApDiagram forState:UIControlStateNormal];
}
}
NSLOG显示前两个日志语句之间的延迟约3秒钟无法理解为什么......
更新了我的最新代码......
-(void)loadImage {
[myAp ImageForAp];
NSLog(@"ImageFor Ap Ended, %@",myAp.ApDiagram);
[self performSelectorOnMainThread:@selector(UpdateUI) withObject:nil waitUntilDone:NO];
}
-(void)UpdateUI {
[self.activity stopAnimating];
if (myAp.ApDiagram==NULL) {
NSLog(@"Finally Gets Here");
[self.Diagram removeFromSuperview];
}
else {
NSLog(@"Finally Gets Here with Diag");
[self.Diagram setBackgroundImage:myAp.ApDiagram forState:UIControlStateNormal];
}
}
答案 0 :(得分:1)
确保在主线程上运行loadImage
方法。所有UI操作都需要在主线程上发生才能按预期工作。您的代码需要与此类似。
-(void)loadImage {
[myAp ImageForAp];
[self performSelectorOnMainThread:@selector(UpdateUI) withObject:nil waitUntilDone:NO];
}
-(void)UpdateUI {
[self.activity stopAnimating];
if (myAp.ApDiagram==NULL) {
[self.Diagram removeFromSuperview];
}
else {
[self.Diagram setBackgroundImage:myAp.ApDiagram forState:UIControlStateNormal];
}
}
viewDidLoad中也可能存在内存泄漏。
self.queue = [NSOperationQueue new];
应更改为
self.queue = [[[NSOperationQueue alloc] init] autorelease];