2013-05-07 85 views
0

我在那裏我閱讀dispatch_async內的UITableView的自定義單元格的子視圖的內容(的情況下),如下:Dispatch_async停止的UITableView重裝

dispatch_async(myQueue,^{ 
    [self filterArrays]; 
    [self updateSlotData]; 

}); 

的updateSlotData內:我想訪問的UITableViewCell的子視圖如下:

for (int i = 1 ; i <= [slotTable numberOfRowsInSection:0]; i++) { 
    SlotDataCell *cell = (SlotDataCell *)[slotTable cellForRowAtIndexPath:[NSIndexPath indexPathForItem:i-1 inSection:0]]; 
    NSLog(@"iterating inside %i %i %i",[cell.intTF.text length],[cell.toTF.text length],[cell.fromTF.text length]); 

    if(![cell.intTF.text length] || ![cell.toTF.text length] || ![cell.fromTF.text length]){ 

     outdatedTF = [NSString stringWithFormat:@"Slot %i timing",i]; 
     newSlot = false; 
     return NO; 

    } 

} 

在調用重裝數據: isDBSelected = FALSE; addMode = false; [slotTable reloadData];

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 



if(tableView == slotTable){ 
    if(isDBSelected){ 

     if(addMode){ 

      return [countArray count] + 1; 
     }else{ 


      return [countArray count]; 
     } 
    }else{ 
     NSLog(@"new template creation started"); 
     return 1; 
    } 
} 
    return 0; 
} 

該表重新加載,第一行被初始化爲零。其他行似乎不會消失。預期結果:只創建一行。

+2

任何UI更新都必須位於主線程上。 – Kreiri 2013-05-07 08:58:21

+0

@Kreiri如果UI更新發生在後臺線程意味着什麼,會發生什麼? – Mani 2013-05-07 09:04:38

+0

該線程的EXC_BAD_ACCESS – DesperateLearner 2013-05-07 09:08:15

回答

2

作爲註釋狀態,您正在線程的塊內訪問updateSlotData,該例程使用屬於UI元素的cellForRowAtIndexPath,並且在使用時不在主線程中。此外,您不能直接訪問不可見的單元格,因爲表格不會保留它們,但只回收幾個單元格。

執行此操作的標準方法是創建一個與您的表具有相同數量對象的可變數組。實際上,你可以在其中創建帶有NSMutableStrings的數組,並且在後臺線程上你可以更新字符串值。

當表在委託方法中請求單元時,您將回收或創建一個單元,然後從表中訪問字符串並更新單元格的字符串。同樣,如果值發生變化並且表不滾動,則可以看到是否有任何給定行可見,如果是,則更新該單元格中的字符串。

請注意,由於您的主線程正在讀取該可變數組(和字符串對象),並且您的後臺線程正在更新它們,您需要使用某種鎖來防止出現損壞的數據 - 調度semaphone便於實現此目的。或者,您可以通過調度到mainThread來更新字符串,而不必擔心併發訪問。