在我的iOS應用程序中,我有一個數據庫調用需要一些時間才能完成。此操作正在進行時,屏幕上會顯示一個微調框。我在應用程序崩潰時發生錯誤,「com.myapp未能及時恢復」,所以它好像在主線程上運行數據庫調用,導致問題。Objective-C - 等待另一個線程返回之前繼續返回
目前代碼
-(void)timeToDoWork
{
...
[CATransaction flush];
[[DatabaseWorker staticInstance] doWork];
//Additional UI stuff here
...
if([self->myReceiver respondsToSelector:self->myMessage])
{
[self->myReceiver performSelector:self->myMessage];
}
}
要獲得的doWork功能發生在後臺線程,它看起來像我可以使用大中央調度:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
[[DatabaseWorker staticInstance] doWork];
});
但是,我怎麼預防繼續執行直至完成?我應該在doWork調用之後結束該方法,並將其下的所有內容移動到新函數中?
樣品
-(void)timeToDoWork
{
...
[CATransaction flush];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
[[DatabaseWorker staticInstance] doWork];
dispatch_async(dispatch_get_main_queue(), ^{
[self doneDoingWork];
});
});
}
-(void)doneDoingWork
{
//Additional UI stuff here
...
if([self->myReceiver respondsToSelector:self->myMessage])
{
[self->myReceiver performSelector:self->myMessage];
}
}
有沒有更好的方式來做到這一點?
我認爲你的解決方案看起來不錯。很難確定什麼是「更好」的方式。你可以在一些共享標誌變量上使用KVO,但我認爲你提出的解決方案更清晰。 – uvesten