awakeFromNib调用每个滚动

时间:2015-10-25 14:44:12

标签: ios objective-c uitableview

好吧,我正在使用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比我想象的要复杂得多....

3 个答案:

答案 0 :(得分:0)

你的细胞是一种观点;让它成为一个!

UITableViewController 

^^他要求显示数据源和单元格。他根本不应该知道数据库。

所有记录加载到视图控制器中的数组中(一次),并在配置单元格时提供信息。

数据库查找非常昂贵。把工作放在一个后台线程上就是掩盖了这个问题,抱歉,随着你的数据增加,你将开始有空单元

答案 1 :(得分:0)

这就是为什么在dequeuereusablecellwithidentifier委托方法UITableView中使用cellForRowAtIndexPath来保持数据在请求单元格时可以呈现的原因。

这是我建议做的。

  1. 在视图控制器的loadView中移动您的数据库提取呼叫:[SelectDB initWithTable:@"myFields" from:1 database:@"databases/bcd.sqlite" times:@"databases/times"];使用每个单元格渲染调用数据库都是犯罪行为!
  2. 将数据库本地保存在全局变量中。
  3. 实施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在滚动时修改您的内容。