我有一个小的iPhone应用程序从Web服务加载数据。为了确保在加载数据时没有出错,我在应用程序上创建了一个半透明视图,并使用CFRunloopRun()等待所有数据都在后台加载。这是代码:
self.connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
// Now show an animation
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
UIView *window = [[UIApplication sharedApplication] keyWindow];
UIView *shield = [[UIView alloc] initWithFrame:window.bounds];
shield.backgroundColor = [UIColor blackColor];
shield.alpha = 0.5f;
[window addSubview:shield];
spinner.center = shield.center;
[shield addSubview:spinner];
spinner.hidden = NO;
NSLog( @"JCL.callServerWithRequest(), spinner view: %@, shield view: %@, window: %@", spinner, shield, window );
[spinner startAnimating];
// Hand over to the Runnloop to wait
CFRunLoopRun();
[spinner stopAnimating];
[spinner removeFromSuperview];
[spinner release];
[shield removeFromSuperview];
[shield release];
这样可以正常工作,除非在加载后在任何地方点击某个按钮,所以如果用户点击下载按钮两次,他也会进行两次下载。
任何想法如何在移除盾牌之前消耗UI事件。
谢谢 - 安迪
答案 0 :(得分:0)
尝试不用弄乱runloops。我怀疑UI事件正在进入窗口的正常循环,但是在自定义循环返回之前不会被处理,此时“屏蔽”视图不再用于捕获它们。如果你把盾牌放在适当的位置然后让主要的runloop处理东西,那么盾牌应该正常地抓住它们。
答案 1 :(得分:0)
感谢Anomie,我终于尝试了没有CFRunLoopRun()并且它非常困难,因为执行分为两部分: - 调用和通过回调返回结果。但后来我在众所周知的脚中开枪,因为我试图阻止返回的线程以减慢执行速度,因为它在主线程中再次执行,因此无法执行。
最终我确实放慢了Web服务的速度,然后一切都按预期工作了。