我的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中。我的意思是图像得到正确传递,否则我看不到模糊的背景。 我还有一些来自故事板的界面元素:
因此UIViewController加载模糊背景图像:
正如您所看到的,除了UISwitch(看起来也很奇怪)之外,没有加载任何Storyboard UI元素。 几秒钟后(取决于,有时最多30秒,有时只有3秒)整个用户界面加载:
所以,也许你们中的某个人之前遇到过同样的问题,我真的不明白为什么UI确实需要花费很多时间来“加载”。 CPU百分比约为3%。
我还在这个完成块中添加了一个NSLog():
[self.window.rootViewController presentViewController:clientView animated:YES completion:^{
NSLog(@"done.");
}];
立即调用。 viewDidLoad似乎工作正常,没有可能卡住的行,如果我在viewDidLoad的末尾做一个NSLog,它也会被立即调用,但是视图(如下图所示)未加载(完全地)。
答案 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
});
}