我正在從SQLite數據庫加載一些數據以顯示在UITableView
。爲了確保用戶不被阻塞並且表格被快速顯示,我創建了一個隊列並添加了要在後臺執行的數據庫操作。NSOperationQueue和UITableView
該添加是好的,工作正常,但由於某種原因隨機部分行不更新數據!
我知道數據設置正確,因爲當我點擊行更新我的數據的行,但我似乎無法找到更新用戶界面的方法!我已經嘗試了一切,包括使用setNeedDisplay
等,但沒有任何作品!
這裏是我的代碼:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell* cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.textAlignment = UITextAlignmentRight;
cell.textLabel.numberOfLines = 0;
cell.textLabel.font = [UIFont systemFontOfSize:14];
}
cell.accessoryType = UITableViewCellAccessoryNone;
cell.textLabel.text = @"Loading ...";
cell.tag = indexPath.row;
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(setCellData:)
object:cell];
[queue addOperation:op];
[op release];
return cell;
}
- (void) setCellData:(UITableViewCell *)cell{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
sqlite3_stmt *statement2;
NSString *sqlStr = [NSString stringWithFormat:@"SELECT * FROM poemdata WHERE catid='%d' GROUP BY poemid LIMIT 1 OFFSET %d",catId,cell.tag];
// NSLog(@"%@",sqlStr);
sqlite3_prepare_v2(database, [sqlStr cStringUsingEncoding:NSASCIIStringEncoding], -1, &statement2, nil);
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
if(sqlite3_step(statement2) == SQLITE_ROW){
cell.textLabel.text = [[NSString alloc] initWithUTF8String: (char *)sqlite3_column_text(statement2, 3)];
cell.tag = sqlite3_column_int(statement2, 6);
}else{
cell.textLabel.text = @"Error";
}
sqlite3_finalize(statement2);
[pool release];
}
那麼問題是大小,這個數據庫是巨大的,所以我不能真正加載我所有的行,加載它的一部分邏輯是最複雜的。所以我需要做我做過的事情。問題是如何才能在屏幕上更新單元格。在你的答案的繪圖部分添加[cell setNeedDisplay]將無濟於事。這裏的問題是計時,單元格在數據設置之前顯示,並且由於某種原因從不刷新。 – Amir 2011-03-17 18:31:48
@Amir如果問題是大小(這不是一個不常見的問題),您將需要實現相同類型的分頁行爲,許多面臨類似問題(無論是來自本地數據庫還是網絡連接)的應用都會這樣做。你應該加載一個大的初始集合(比如100-200條記錄取決於你的單元格佈局的複雜性),然後當用戶到達列表底部加載另一個25-50並釋放第一個25-50時保持一個滾動窗口在記憶中。這不像試圖讓你的發佈代碼工作那麼複雜。 – theChrisKent 2011-03-17 18:42:51
謝謝克里斯,我會考慮改變我的邏輯:)這說我仍然想知道爲什麼這是行不通的! – Amir 2011-03-17 18:44:54