Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 唤醒每一个卷轴_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 唤醒每一个卷轴

Ios 唤醒每一个卷轴,ios,objective-c,uitableview,Ios,Objective C,Uitableview,嗯,我使用UITableView显示我的文本字段,我有25行 我想在此字段中显示来自我的数据库的数据,为此,我使用以下代码: - (void)awakeFromNib { NSMutableArray *arrayFields = [[NSMutableArray alloc] init]; arrayFields = [SelectDB initWithTable:@"myFields" from:1 database:@"databases/bcd.sqlite" tim

嗯,我使用UITableView显示我的文本字段,我有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];
    ......


}
这段代码工作得很好,可以将文本放在我的字段中,但是当我滚动表格时,它的速度很慢

当表向上或向下滚动时,将调用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
我可以解决这个问题,将代码(从nib内部awakeFromNib)移动到cellforrowatinexpath,然后缓慢停止

但我发现了另一个问题!让我们尝试更改我的第一个文本字段中的文本让我们将文本放入“Hello World”,太好了,现在让我们向下滚动到最后一个字段并更改他的文本…让我们回到第一个字段,“Hello World”消失


使用UITable比我想象的更复杂……

您的单元格就是一个视图;让它成为一个

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

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


数据库查找非常昂贵。将工作放在后台线程可以掩盖问题抱歉,随着数据的增加,您将开始有空单元格

这就是为什么在
UITableView
委托方法
cellforrowatinexpath
中使用
dequeuereusablecellwithidentifier
的原因,以便在请求单元格时随时呈现数据

以下是我的建议

  • 在视图控制器的
    loadView
    中移动DB fetch调用:
    [选择DB initWithTable:@“myFields”from:1 database:@“databases/bcd.sqlite”times:@“databases/times”]使用每个单元格渲染调用DB是一种犯罪
  • 在全局变量中本地保存DB数据
  • 实现
    cellforrowatinexpath
    方法,并在其中设置单元格文本字段数据
    在你的情况下,也许我会尝试另一种方法。也许在数据库中获取所需的记录,并将其放入我的视图控制器的数组中。在UITableView的
    cellforrowatinexpath:
    方法中使用它之后

    但是,您可以进一步创建一个模型类来映射每个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];
    }
    
    //将self.arrayFields理解为数据库中所有记录的数组
    NSMutableArray*mappedRecords=[@[]mutableCopy];
    对于(NSInteger i=0;i
    我认为这种方法更好。此外,通过在UITableViewCell对象内创建一个方法(如
    configureCellWithObject:object
    ),您可以将每个单元格的填充从
    cellForRowAtIndexPath:
    隔离到单元格本身。您的数据源方法将看起来最干净

    关于编辑2


    这是因为细胞的重复使用。当tableview检索要重用的新单元格时,它会在该位置使用新对象更改其内容。您必须在该点修改对象的内容,以避免在滚动时tableView修改您的内容。

    -(void)awakeFromNib
    是自定义单元格的方法吗?为什么为每个单元格选择每次?为什么不选择数组中的所有数据。然后获取数组中每个单元格的数据?你完全错了。细胞重复使用;他们没有自己的数据。将数据与单元格关联的位置是
    cellforrowatinexpath:
    。将您的
    awakeFromNib
    实现抛出窗口并重新开始。@anhtu我现在就这样做!,请参阅我的编辑帖子(编辑2),我投票将这个问题作为离题题题结束,因为它的变化比Liberace的变化快。