0

我有一个从 Web 服务加载数据的小 iPhone 应用程序。为了确保在加载数据时不会出错,我在应用程序上创建了一个半透明视图,并使用 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 事件。

谢谢 - 安迪

4

2 回答 2

0

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

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

于 2011-03-19T23:39:48.270 回答
0

试试吧,不要弄乱运行循环。我怀疑 UI 事件正在进入窗口上的正常循环,但在您的自定义循环返回之前不会被处理,此时“屏蔽”视图不再可以捕获它们。如果你把防护罩放在适当的位置,然后让主运行循环处理事情,防护罩应该像往常一样捕捉它们。

于 2011-03-19T02:00:58.717 回答