簡體   English   中英

UIViewController延遲后加載

[英]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的界面元素:

Storyboard截圖

所以UIViewController加載了模糊的背景Image:

模糊背景示例

如您所見,除了UISwitch(看起來也很奇怪)之外,沒有加載任何Storyboard UI元素。 幾秒鍾后(取決於,有時最多30秒,有時只有3秒)整個用戶界面加載: 整個UI一段時間后

所以,也許你之前有人遇到過同樣的問題,我真的不明白為什么用戶界面需要花費很多時間來“加載”。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM