2013-08-06 196 views
-5

是否可以多次調用包含繁重操作的操作?像保存按鈕(我保存第一個對象),並希望添加其他人,但該應用程序變得如此緩慢,我無法導航到其他視圖緩慢的應用程序

+0

請更具體的與您的問題。向我們展示一些代碼。 – Luke

+1

on concurrency:http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008091 –

+0

在對修復提出任何建議之前給定,你必須找出*爲什麼*它很慢。請參閱http://stackoverflow.com/questions/9263783/iphone-time-profile-instrument瞭解如何配置應用程序以縮小發生的情況。 – BergQuester

回答

1

您需要確保您沒有捆綁主UI你的應用程序的線程。一個可能的簡單解決方法是在不同的線程上執行保存操作。下面是如何只是使用大中央調度做了一個例子:iPhone - Grand Central Dispatch main thread

例子:

//notice this saveQueue is a new dispatch queue that's been created. 
dispatch_queue_t saveQueue = dispatch_queue_create("com.mycompany.myqueue", 0); 

dispatch_async(saveQueue, ^{ 
    //this command represents your long running operation 
    doSaveOperation(); 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     //always update your UI on the main thread! 
     [self showCompleteMessage]; 
    });  
}); 
+0

感謝您的回覆:什麼是showCompleteMessage? –

+0

@OuassimMouyarden,如果您需要在保存完成時提示用戶,那麼您只需調用一個方法來更新UI即可。告訴用戶他們的保存操作已經完成,這是沒有必要但很好的做法。 –

+0

現在什麼時候會嘗試再次調用doSaveOperation,即使它尚未完成我的第一次調用,是否會使用相同的線程? –

1

您可以隨時玩弄大量數據保存相關任務的背景。您可以將與內容有關的東西分發給各種線程(隊列),您需要分離您保存的內容,並且如果它阻止了您的UI並使您的應用程序變慢,那麼您需要在後臺執行這些繁重的操作。

請確保您不要在後臺執行任何UI更新操作。嘗試閱讀關於GCD(它是如何工作的),如何創建背景隊列等以及如何玩弄它。我假設你可能正在使用核心數據來保存保存按鈕上的內容。嘗試閱讀關於父/子管理上下文對象。稍微玩一下,將繁重的任務轉移到背景中,UI的更新將始終在Main或UI線程上(如果您使用的是分派隊列,則可以通過調用get_main_queue()來完成更新)。快樂編碼。如果您有特定的代碼,那麼請告訴我們。我們很樂意提供幫助。 :)

+0

這是我嘗試做的,但使得應用程序如此緩慢:dispatch_async(dispatch_get_main_queue(),[self saveMethod:]; });其中saveMethod是包含繁重操作的方法 –

+0

@OuassimMouyarden您需要確保使用除主隊列以外的其他隊列。否則,就好像您正在嘗試在主線程上執行此操作。在我的答案鏈接中,創建了一個不是主隊列的新分派隊列。 –

+0

你正在做這件事,你需要創建自己的隊列並嘗試使用它。這是主隊列 - dispatch_get_main_queue()。你需要轉移到另一個線程的勢頭。 –