0

我想在我打电话时立即展示我的观点。我不知道如何使视图显示。

-(IBAction) showProgress: (id) sender {
   progressViewController *progress = [[progressViewController alloc] initWithNibName:@"progressViewController" bundle:NULL];
   [self.view addSubview:progress.view];
   [self someFunctionWhichTakesAgesToBeDone];
}

它是从当前 UIViewController 调用的。并且视图出现在长函数之后。如何在长功能之前显示它?感谢您的回答。

4

3 回答 3

1

使用 GCD(Grand Central Dispatch),这是最简单的方法(Apple 推荐),代码将是:

-(IBAction) showProgress: (id) sender {
    progressViewController *progress = [[progressViewController alloc] initWithNibName:@"progressViewController" bundle:NULL];
    [self.view addSubview:progress.view];

    // Heavy work dispatched to a separate thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatched");
        // Do heavy or time consuming work
        [self someFunctionWhichTakesAgesToBeDone];

        // When finished call back on the main thread:
        dispatch_async(dispatch_get_main_queue(), ^{
            // Return data and update on the main thread
        });
    });

}

是两个街区。第一个在单独的线程上完成繁重的工作,然后在完成繁重的工作后调用第二个块,以便在需要时在主线程上完成更改和 UI 更新。

于 2012-09-23T21:31:50.410 回答
0

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait`

采用

[self.view performSelectorOnMainThread:@selector(addSubview:) withObject:progress.view waitUntilDone:YES]

或将您的 Sleep() 函数(我希望它是其他任何东西,Sleep() func 真的很糟糕,因为它被告知)放入另一个函数MySleepFunc并调用

[self performSelector:@selector(MySleepFunc) withObject:nil afterDelay:0.003]

而不是睡眠(3)。

于 2012-09-23T20:36:45.853 回答
0

阅读有关多线程的信息。简而言之,有一个 UI 线程可以进行绘图、接受用户事件等。如果您使用 sleep() 或任何其他阻塞方法暂停它,则不会显示/重绘任何内容,也不会处理任何事件。您必须从后台线程发出 HTTP 请求。

于 2012-09-23T20:48:46.117 回答