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,暗示此代碼正在從塊中執行。可能有更清晰的方法來處理這個問題,但您需要提供更多信息。
停止使用「Xcode」標籤。它不適用於你的問題。 – rmaddy
好吧,我會記住任何解決方案? – Mahavir
在後臺執行圖像處理,以免阻塞主線程。 – rmaddy