好吧,我正在使用UITableView来显示我的TextFields,我有25行。
我想在这个字段中显示数据来自我的数据库,为此我使用下面的代码:
- (void)awakeFromNib {
NSMutableArray *arrayFields = [[NSMutableArray alloc] init];
arrayFields = [SelectDB initWithTable:@"myFields" from:1 database:@"databases/bcd.sqlite" times:@"databases/times"];
self.textField1.text = arrayFields[1];
self.textField2.text = arrayFields[2];
......
}
此代码效果很好并将文本放在我的字段中,但在滚动表格时 SLOW 。
当表格向上或向下滚动时,调用awakeFromNib方法,我需要再次选择数据库中的数据并更改字段值。
为了尝试解决这个问题,我将SELECT函数移动到后台线程,并使用以下代码将UI命令移动到主线程:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
// Perform async operation
// Call your method/function here
// Example:
// NSString *result = [anObject calculateSomething];
dispatch_sync(dispatch_get_main_queue(), ^{
// Update UI
// Example:
// self.myLabel.text = result;
});
});
这是解决此问题的最佳方法吗?有另一种方式更简单和优化吗?
EDIT
在这种情况下使用GCD我的应用程序有时会崩溃....
EDIT 2
好吧,我可以解决这个问题,将代码(在awakeFromNib中)移动到cellForRowAtIndexPath,并且缓慢停止!
但我发现另一个问题!让我们尝试更改我的第一个文本字段内的文本让我们把文字“Hello World”,很棒,现在让我们向下滚动到最后一个字段并更改他的文本...让我们回到第一个字段而“Hello World”消失了!
使用UITable比我想象的要复杂得多....
答案 0 :(得分:0)
你的细胞是一种观点;让它成为一个!
UITableViewController
^^他要求显示数据源和单元格。他根本不应该知道数据库。
将所有记录加载到视图控制器中的数组中(一次),并在配置单元格时提供信息。
数据库查找非常昂贵。把工作放在一个后台线程上就是掩盖了这个问题,抱歉,随着你的数据增加,你将开始有空单元
答案 1 :(得分:0)
这就是为什么在dequeuereusablecellwithidentifier
委托方法UITableView
中使用cellForRowAtIndexPath
来保持数据在请求单元格时可以呈现的原因。
这是我建议做的。
loadView
中移动您的数据库提取呼叫:[SelectDB initWithTable:@"myFields" from:1 database:@"databases/bcd.sqlite" times:@"databases/times"];
。 使用每个单元格渲染调用数据库都是犯罪行为! cellForRowAtIndexPath
方法并在其中设置单元格文本字段数据。 答案 2 :(得分:0)
在你的情况下,也许我会尝试不同的方法。也许在DB中获取所需的记录并将其放入我的View Controller中的数组中。在UITableView的cellForRowAtIndexPath:
方法中使用它之后。
然而,您可以通过创建模型类来映射每个BD记录并使用循环填充数组来进一步:
// understanding self.arrayFields as the array of all the records from the DB
NSMutableArray *mappedRecords = [@[] mutableCopy];
for (NSInteger i = 0; i < self.arrayFields.count; i++)
{
CustomClass *object = [[CustomClass alloc] init];
object.field1 = self.arrayFields[i][0];
object.field2 = self.arrayFields[i][0];
[mappedRecords addObject:object];
}
我认为这种方法更好。此外,您可以通过在UITableViewCell对象(如cellForRowAtIndexPath:
)内创建一个方法,将每个单元格的填充从configureCellWithObject:object
隔离到单元格本身。您的数据源方法看起来最干净。
关于编辑2
这是因为重复使用细胞。当tableview检索要重用的新单元时,它会使用该indexPath处的新对象更改其内容。您必须在此时修改对象的内容,以避免tableView在滚动时修改您的内容。