我正在開發一個iOS應用程序,使用UITableView在某個階段添加或刪除一堆行。由於存在大量的行,因此此操作可能需要很長時間。但是,我不能輕易確定是否需要很長時間。長時間運行後延遲自旋活動指標
我想只顯示一個UIActivityIndicator(微調),如果此操作需要很長時間。我一直這樣做的方式是開始冗長的操作,並經過一段時間(比如說0.5秒)後測試操作是否仍在運行,如果是,我們開始顯示UIActivityIndicator。
如果你可以在後臺線程中運行冗長的操作,這是沒有問題的。然而,這種特殊情況很棘手,因爲冗長的操作(deleteRowsAtIndexPaths:withRowAnimation :)必須在主線程中運行(如果我在後臺線程中運行此方法,應用程序在後臺線程嘗試更新UI時偶爾崩潰)。
,我已經嘗試了最新的東西是這樣的線路:
- (void) manipulateTableView
{
stillBusy = YES;
[self performSelectorInBackground:@selector(waitBeforeShowingBusyIndicatorForView:) withObject:view];
.
.
.
[self performSelectorOnMainThread:@selector(deleteRowsAtIndexPathsWithRowAnimation:) withObject:args waitUntilDone:YES];
stillBusy = NO;
}
- (void) waitBeforeShowingBusyIndicatorForView:(UIView*) view
{
usleep((int) (BUSY_INDICATOR_DELAY * 1000000));
if (stillBusy)
[self performSelectorOnMainThread:@selector(showBusyIndicatorForView:) withObject:view waitUntilDone:NO];
}
因爲showBusyIndicatorForView:操縱UI,它必須在主線程中調用,否則應用程序可能會崩潰。
當deleteRowsAtIndexPaths:withRowAnimation:需要很長時間時,waitBeforeShowingBusyIndicatorForView中的延遲過期並調用performSelectorOnMainThread:...方法,並立即返回。但是接下來調用deleteRowsAtIndexPaths:withRowAnimation:完成後,showBusyIndicatorForView:方法僅調用後,這違背了目的。
我想我明白爲什麼會發生這種情況。 deleteRowsAtIndexPaths:withRowAnimation:方法在主循環的迭代中運行,並且在運行時,showBusyIndicatorForView:的調用將作爲主循環的消息排隊。只有在主循環完成後才執行deleteRowsAtIndexPaths:withRowsAnimation:它輪詢隊列中的下一條消息,然後開始執行showBusyIndicatorForView :.
有什麼辦法讓這個東西正常工作。是否有可能中斷主循環,並立即執行showBusyIndicatorForView:
你是針對ios6嗎? –