相當普遍的問題,有沒有一種方法可以在不阻礙UI加載的情況下調用我經常使用的每個應用程序的方法?如何反覆調用方法而不阻塞UI?
回答
您可以使用Grand Central Dispatch此:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{
// Call your method.
});
這是遞歸調用它嗎? – Tukajo
我現在看到你已經標記了「遞歸」問題。不,這只是執行你在後臺線程中的代碼塊。您當然可以使用GCD與遞歸或迭代相結合。 GCD的目的是改進併發代碼執行。 – geraldWilliam
對於那些發現這個問題的人,一定要查看0x7fffffff關於dispatch_apply的答案。 – geraldWilliam
你可以使用:
[self performSelectorInBackground:@selector(aMethod) withObject:nil];
對於不帶參數的方法。或者像
[self performSelectorInBackground:@selector(otherMethodWithString:andData:) withObjects:string, data, nil];
如果你有參數。
下面是另一個例子,解釋如何執行背景隊列並在其中進行迭代。
- (void)method
{
// start a background proccess that will not block the UI
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 1000000; i++) {
if (i == 999) {
// Need to iterate with interface elements when inside a background thread.
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Found" message:@"Found your number" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertView show];
});
}
NSLog(@"Count: %d",i);
}
});
}
你想'我<1000000',而不是'I> 1000000'。 – rmaddy
謝謝,修復它。 – alexandresoli
它只顯示一個提醒,當它發現號碼999. – alexandresoli
正如其他人所指出的那樣,使用GCD絕對是一種好方法。
或者,如果您希望操作可以被取消(例如加載Web資源),您可以考慮子類化NSOperation
並檢查isCancelled
。
(AFNetworking實際上做到這一點(在製造/管理Web請求例如AFHTTPRequestOperationManager
)。)
結帳上NSOperation
蘋果文檔,也this tutorial on Ray Wenderlich's site對NSOperation
S比細節。
你一定想用Grand Central Dispatch來做到這一點,但我只想指出,GCD有一個方法來構建這種類型的東西。 dispatch_apply()
在您選擇的隊列中執行指定次數的區塊,當然,還要跟蹤您沿途正在進行的迭代。下面是一個例子:
size_t iterations = 10;
dispatch_queue_t queue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);
dispatch_apply(iterations, queue, ^(size_t i) {
NSLog(@"%zu",i);// Off the main thread.
dispatch_async(dispatch_get_main_queue(), ^{
// Go back to main queue for UI updates and such
});
});
- 1. C#等任務,而不阻塞UI
- 2. Thread.sleep()方法阻塞主UI線程
- 3. Java t.join()阻塞方法調用
- 4. 阻塞線程的調用方法
- 5. CoreData阻塞UI
- 6. 如何關閉對話框而不阻塞UI
- 7. 如何從AsyncTask獲取結果而不阻塞UI線程?
- 8. UI阻塞,而NSFetchedResultsController加載數據
- 9. WPF:非阻塞UI
- 10. 如何編寫非阻塞javascript方法?
- 11. 扭曲的非阻塞方法 - 如何?
- 12. 異步使用HttpWebRequest而不阻塞UI線程
- 13. 在VS2010中調試時UI阻塞
- 14. WCF阻塞調用
- 15. 在Windows svc中調用自託管的WCF服務而不阻塞UI
- 16. 等待調用異步方法不會阻塞線程
- 17. asp.net不調用方法反覆
- 18. 在java中調用超時的阻塞方法調用
- 19. 如何在主UI線程中等待用戶交互而不阻塞它?
- 20. 阻塞和不阻塞子進程調用
- 21. 阻塞或不阻塞(Express.js)
- 22. Ui線程被阻塞,但僅在第一次調用Webclient異步方法時
- 23. 的ObservableCollection方法Add()阻塞
- 24. uitableview reloaddata方法阻塞uithread
- 25. InputStream接收方法阻塞
- 26. 如何取消阻塞的OpenGL調用
- 27. 不阻塞CPU負載的方法
- 28. Android Asynctask:等待整個計算而不會阻塞UI線程
- 29. 在哪裏訂閱findAllAsync()。asObserable()而不阻塞UI線程?
- 30. Java:等待線程結果而不阻塞UI?
在後臺線程調用它 –