[英]UIViewController loading after delay
我的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中。 我的意思是圖像得到正確傳遞,否則我看不到模糊的背景。 我還有一些來自Storyboard的界面元素:
所以UIViewController加載了模糊的背景Image:
如您所見,除了UISwitch(看起來也很奇怪)之外,沒有加載任何Storyboard UI元素。 幾秒鍾后(取決於,有時最多30秒,有時只有3秒)整個用戶界面加載:
所以,也許你之前有人遇到過同樣的問題,我真的不明白為什么用戶界面需要花費很多時間來“加載”。 CPU百分比約為3%。
我還在這個完成塊中添加了一個NSLog():
[self.window.rootViewController presentViewController:clientView animated:YES completion:^{
NSLog(@"done.");
}];
這是即刻召喚的。 viewDidLoad似乎工作正常,沒有可能卡住的行,如果我在viewDidLoad的末尾做一個NSLog,它也會被立即調用,但是視圖(如下圖所示)未加載(完全)。
從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
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.