UIViewController延迟后加载

时间:2014-01-01 17:10:55

标签: ios objective-c uiviewcontroller

我的UIViewController中有一些非常奇怪的行为。我通过Multipeer Framework连接两个设备,一旦iPhone开始发送数据,我希望其他iPhone显示处理接收数据的UIViewController。因此,一旦iPhone A开始发送,iPhone B就会发布NSNotification。通知很快到达,下面的代码正在执行:

- (void)presentPeerView:(NSNotification *)notif
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    ClientViewController *clientView = (ClientViewController *)[storyboard instantiateViewControllerWithIdentifier:@"peerView"];
    [clientView setImage:_image];
    clientView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.window.rootViewController presentViewController:clientView animated:YES completion:nil];
}

现在出现了奇怪的部分。首先,显示ClientViewController。但是没有动画,它只是无处不在。我的viewDidLoad被调用并运行以下代码:

- (void)viewDidLoad
{
    [self.view setBackgroundColor:[UIColor colorWithPatternImage:[self blurImage:_image];
    [self.imageView setImage:_image];        
}

现在,我看到模糊的图像,这很好。但是(非模糊)图像不会显示在UIImageView中。我的意思是图像得到正确传递,否则我看不到模糊的背景。 我还有一些来自故事板的界面元素:

Screenshot from Storyboard

因此UIViewController加载模糊背景图像:

blurred Background example

正如您所看到的,除了UISwitch(看起来也很奇怪)之外,没有加载任何Storyboard UI元素。 几秒钟后(取决于,有时最多30秒,有时只有3秒)整个用户界面加载: Whole UI after some time

所以,也许你们中的某个人之前遇到过同样的问题,我真的不明白为什么UI确实需要花费很多时间来“加载”。 CPU百分比约为3%。

我还在这个完成块中添加了一个NSLog():

[self.window.rootViewController presentViewController:clientView animated:YES completion:^{
NSLog(@"done.");
}];

立即调用。 viewDidLoad似乎工作正常,没有可能卡住的行,如果我在viewDidLoad的末尾做一个NSLog,它也会被立即调用,但是视图(如下图所示)未加载(完全地)。

1 个答案:

答案 0 :(得分:2)

从MCSession类引用:

  

重要提示:委托调用发生在专用操作队列中。如果您的应用需要对特定的运行循环或操作队列执行操作,则其委托方法应明确分派或安排该工作。

你看到了这种延迟,因为你正在UIView上做错误的线程。

有很多方法可以解决这个问题,例如:

- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {
    dispatch_async(dispatch_get_main_queue(), ^{
        // post your notification or display your view
    });    
}