2012-11-08 38 views
1

我正在運行到索引超出範圍例外之一,在我的UITableViews和我認爲它可能歸結爲一些多線程問題。這就是我認爲正在發生的事情:UITableViewDataSource和多線程

  1. 我有一個UITableView和它的數據源是一個普通NSMutableArray
  2. 這個支持我的UITableViewNSMutableArray每隔幾秒就會更新一次API響應的內容。
  3. 每次更新後,都會調用UITableView的reloadData以確保用戶看到來自API服務器的新數據。
  4. 有時超出界限異常的索引被拋出。

這裏是我的代碼:

-(NSMutableArray*) currentBetEvents 
{ 
    return currentMarketId == nil ? [[BFOpenBetsModel sharedInstance] betEvents] :  filteredBetEvents; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{  
    NSArray *betEvents = [self currentBetEvents]; 
    return [betEvents count]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSArray *betEvents = [self currentBetEvents]; 
    id obj = [betEvents objectAtIndex:indexPath.section] // this is where it blows up 

基本上,我得到一個異常,而試圖在索引來訪問betEvents結構的對象0

相信的情況是:

  1. reloadData被調用UITableView
  2. numberOfSectionsInTableView:被調用,返回的值大於0.
  3. 胭脂線程到達並清除了UITableView的數據源。
  4. cellForRowAtIndexPath:被調用並炸彈。

有什麼方法可以確保不會發生這種情況嗎?我是否需要開始在數據源上使用一些原始鎖,以確保在更新表時不會更新?


編輯 拿了再看看由currentBetEvents返回的數據結構可以如何改變,它看起來像filteredBets & betEvents可以如下面的代碼,結果被清除出:

[[NSNotificationCenter defaultCenter] postNotificationName:kUserLoggedOutNotification object:nil]; 

每當用戶註銷時都會發布此通知。每當用戶註銷應用程序時,我需要清除filteredBets和betEvents數組。是有可能,以下可能發生:

  1. reloadData被呼籲UITableView
  2. numberOfSectionsInTableView:調用它返回一個值> 0
  3. 用戶註銷揭開序幕通知&送走數據結構。
  4. cellForRowAtIndexPath:被調用並炸彈。

感謝,

肖恩

+0

你正在實現numberOfRowsInTableView? – rdelmar

+1

我認爲你需要展示betEvents如何得到更新,以及你如何通知表視圖它需要更新。 – rdelmar

+0

rdelmar - 我沒有實現numberOfRowsInTableView。只需numberOfRowsInSection和numberOfSectionsInTableView。編輯我的答案,以包含更多關於賭注數組如何更新的更多信息。謝謝。 – seanoshea

回答

2

肯定聽起來像一個線程的問題。你可能會嘗試這樣的事情:

// view controller 
@synchronized([[BFOpenBetsModel sharedInstance] betEvents]) 
{ 
    [self.tableView reloadData]; 
} 

… 

// data model 
@synchronized(_betEvents) // or whatever the instance variable -betEvents returns is 
{ 
    [_betEvents addObject:whatever]; 
} 
+0

嗨,諾亞。由於NSTableView繪圖正在主UI線程上進行,我是否可以確保所有對bet事件的編輯都在主UI線程上執行? – seanoshea

+0

這也可以起作用,但總的來說,您不想在主線程上執行任何數據,因爲它可能會傷害您的應用程序的響應速度。 –