2012-08-28 69 views
0

我有一個啓動到標籤欄控制器的應用程序。當應用程序啓動或從後臺返回時,它會檢查服務器以更新其數據。如果更新可用,則可能需要幾秒鐘才能獲取數據並進行更新。立即顯示子視圖/等到視圖可見後再繼續

我想簡單地介紹一個覆蓋視圖,告訴用戶應用程序的數據正在更新,請等待幾秒鐘。我試圖做到這一點是如下的方式:即採用更新的護理在我的課,我有:

AppDelegate *delegate = [UIApplication sharedApplication].delegate; 
[delegate.tabBarController.selectedViewController.view addSubview:updatingDataView]; 
[self runUpdateMethods]; 

的問題是,updatingDataView出現在更新方法完成後才屏幕。我怎樣才能讓它在更新方法開始之前出現?

+1

更新方法是在後臺線程上執行它們的工作還是阻塞主線程? – warrenm

+0

目前他們阻止主線程,我想盡可能保持這種方式。 – Darren

+0

在保持響應的同時,無法在主線程上運行它們。您應該按照以下答案中的建議在後臺線程上完成這項工作。 – warrenm

回答

1

您需要清空您的運行循環,以便您添加的視圖將在屏幕上繪製。借鑑iOs不是實時完成的。你基本上設置你的繪圖並退出你的方法,並且運行循環實際上繪製它。所以你需要做的就是延遲執行runUpdateMethods,直到你退出程序。嘗試改爲:

[self performSelector:@selector(runUpdateMethods) withObject:nil afterDelay:0.0]; 
+0

謝謝,我想這基本上是我在找的東西。現在我已經得到了一些反饋,我意識到在另一個線程中運行更新方法可能會更聰明,但我會嘗試使用此解決方案來查看它是否適用於我。 – Darren

+0

我相信'performSelector:'仍然在調用線程上運行,請參閱NSObject的文檔 - 「此方法設置一個計時器以在當前線程的運行循環中執行aSelector消息。」這仍然會阻止用戶界面。您可能想使用'performSelectorInBackground:'代替。 – Joe

+0

是的。這將阻止他的主線,這是他想要做的。他也可以推動模態觀點,並在完成時將其解散。 –

6

看起來你正在主線程上運行[self runUpdateMethods];(這將阻止你的UI更新)。你會想在後臺線程上運行它。喜歡的東西:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), 
       ^{ 
        [self runUpdateMethods]; 
       }); 

[self performSelectorInBackground:@selector(runUpdateMethods) withObject:nil];

更新

既然你想要做的事[self runUpdateMethods];完成,你會想要做這樣的事情後:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), 
^{ 
    [self runUpdateMethods]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self doSomethingAfterUpdate]; 
    });  
}); 

這樣做會使您仍然有能力知道runUpdateMethods何時返回並且不會掛起UI。

2

您的更新方法(連接)可能正在主線程上執行,阻止UI更新。您應該使用異步方法(gcd,NSThread,NSOperationQueue等)來運行更新。