簡體   English   中英

UITableView追加行時偶爾崩潰

[英]UITableView occasional crash while appending rows

我的應用程序有一個UITableViewController,它在追加行后得到“無效更新:第0節中無效的行數...”。 事實是,它僅在%0.2的會話中發生。 我們的應用程序具有數百萬個會話,因此崩潰正在累積。

流程很簡單。 這是將用戶音樂與我們的視頻目錄相匹配的功能的一部分。 后台線程發出一系列請求。 請求發出,結果返回響應,然后將這些結果附加到我們選項卡之一中的tableView中。 這些請求是成批處理的,並且可以總計許多結果行。 因此,我想適當地附加它們,而不是在批處理后調用reloadData。 效果很棒,但偶爾會崩潰。

我能夠在設備上重現一次。 它從未在模擬器上發生過。 據我所知,崩潰是相當隨機的,盡管它大多發生在3gs上。 最少的撞車事故來自4s。

這是代碼。 回復回來了。 在這種情況下,allMatches是到目前為止的每個匹配項(表的數據源)。 batchMatches是新藝術家的數量。 兩者都是數組:

    [self.tableView beginUpdates];
    NSMutableArray *paths = [[NSMutableArray alloc] init];
    for (int i = [allMatches count] - [batchMatches count]; i < [allMatches count]; ++i) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];        
        [paths addObject: indexPath];
    }
    [self.tableView insertRowsAtIndexPaths:paths withRowAnimation:NO]; 
    [self.tableView endUpdates];
    [paths release];

代碼很簡單。 它只是將行追加到末尾,每個結果一行。 從不刪除。 完整異常消息的示例為“無效更新:部分0中的行數無效。更新(131)之后現有部分中包含的行數必須等於更新之前該部分中包含的行數( 131),請在該節中插入或刪除的行數加或減(插入20條,刪除0條),再加上或減去移入或移出該節的行數(移入0條,移出0條)。” 在實際的故障報告中,到處都是數字,因此它不是特定的批號。

就像我說的,它幾乎總是可行的。 它通常在3GS上崩潰。 我想知道這是否可能是框架錯誤。 在每次批處理返回后,我總是可以調用reloadData,但是每次都會導致表格單元格的閃爍。 我故意觸發了異常,並且似乎該表已死,所以我無法使用reloadData進行try / catch作為catch塊中的后備。

外面有人可以照明嗎? 很抱歉,這篇文章的長度。

編輯:服務器請求是使用NSOperationQueue完成的,因此它們在后台線程上。 當響應返回時,我在主線程上發布了一條通知,這導致表代碼運行。 通知發布如下:

NSNotification *notification = [NSNotification notificationWithName:notificationName object:self];
[self performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:NO];  

發布通知只是[[NSNotificationCenter defaultCenter] postNotification:notification]的包裝。 因此,表代碼應位於主線程上。

我的猜測是,您正在后台線程中執行表視圖更新。 您應該在主線程上執行此操作。

將您的代碼放在dispatch_async塊中。

dispatch_async(dispatch_get_main_queue(), ^(void) {
       // ..
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM