2014-06-10 70 views
0

我正在做一些圖像處理,這也顯示加載。問題是加載沒有更新。UI不更新,而某些函數需要時間來執行?

for (ALAsset *asset in assets) { 
    weakSelf.HUD.labelText = [NSString stringWithFormat:@"%d/%d",count,assets.coun 
    weakSelf.HUD.progress=(CGFloat)count/assets.count; 
    [objDoc setImageProcess:asset]; 
    count++; 
} 

此處HUD未更新其值。如果我把延遲,然後顯示。這裏setImageProcess需要時間,而處理。

+1

停止使用「Xcode」標籤。它不適用於你的問題。 – rmaddy

+0

好吧,我會記住任何解決方案? – Mahavir

+0

在後臺執行圖像處理,以免阻塞主線程。 – rmaddy

回答

2

UI更新發生在iOS和Mac OS的主線程中。如果您在後臺線程上運行耗時的代碼,則可以將消息發送到主線程以更新UI,並且它可以很好地工作。

如果您在主線程上運行耗時的代碼,UI更改會累積起來,並且只有在應用程序返回並訪問事件循環時纔會呈現在屏幕上。

因此,如果您有一個循環執行一堆耗時的任務,並且在整個循環完成之前不會返回,則它不起作用,因爲UI更新不會在您返回之前發生。

您需要重構代碼才能在迭代之間返回。是這樣的:

創建一個實例變量assetCount:

@interface myClass: UIViewController; 
{ 
    NSInteger assetIndex; 
} 
@end. 

然後

-(void) viewDidLoad; 
{ 
    assetIndex = 0; 
    [self processAssets]; 
} 

- (void) processAssets; 
{ 
    if (assetIndex >= assets.count) 
    return; 
    ALAsset *asset = assets[assetIndex]; 
    weakSelf.HUD.labelText = [NSString stringWithFormat:@"%d/%d",count,assets.coun 
    weakSelf.HUD.progress=(CGFloat)count/assets.count; 
    [objDoc setImageProcess:asset]; 
    assetIndex++; 
    count++; 

    //The following method call queues up a method call 
    //for the next time your app visits the event loop. (plus an optional delay) 
    [self performsSelector: processAssets 
    withObject: nil 
    afterDelay: 0]; 
} 

的方法,上述方法1級的資產,然後排隊到本身的延遲呼叫。即使延遲值爲0,它仍然可以解決您的問題。這是因爲performSelector:withObject:afterDelay:方法總是立即返回,並將方法調用排隊等待下一個事件循環。在接下來的事件循環中,系統會像更新屏幕一樣進行清理,然後檢查像這樣的未決呼叫。如果有延遲,它將啓動一個計時器。如果沒有,它會觸發你的方法調用。

您在發佈的代碼中有一個變量計數,可能會作爲數組索引。我添加了一個新的實例變量assetIndex來跟蹤當前的數組索引。您的代碼也使用術語weakSelf,暗示此代碼正在從塊中執行。可能有更清晰的方法來處理這個問題,但您需要提供更多信息。

+0

感謝他的工作。 – Mahavir

0

對於所有UI更改,您必須調用mainthread。驗證當前函數在主線程中調用:

BOOL isMainThread = [[NSThread currentThread] isMainThread] 
+0

我已經檢查過它的返回1意味着mainthread – Mahavir

+0

正常的過程是:你需要花時間在後臺線程的功能,當它需要更新UI時,調用更新mainthread中的UI(使用GCD異步,performSelectorOnMainThread,添加到[NSOperationQueue mainQueue],..)。否則,它會阻止您的主線程更新UI。 –

相關問題