如何在后台加载数据时使用UI事件

时间:2011-03-19 01:36:39

标签: iphone events cfrunloop

我有一个小的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事件。

谢谢 - 安迪

2 个答案:

答案 0 :(得分:0)

尝试不用弄乱runloops。我怀疑UI事件正在进入窗口的正常循环,但是在自定义循环返回之前不会被处理,此时“屏蔽”视图不再用于捕获它们。如果你把盾牌放在适当的位置然后让主要的runloop处理东西,那么盾牌应该正常地抓住它们。

答案 1 :(得分:0)

感谢Anomie,我终于尝试了没有CFRunLoopRun()并且它非常困难,因为执行分为两部分: - 调用和通过回调返回结果。但后来我在众所周知的脚中开枪,因为我试图阻止返回的线程以减慢执行速度,因为它在主线程中再次执行,因此无法执行。

最终我确实放慢了Web服务的速度,然后一切都按预期工作了。