Ios 唤醒每一个卷轴
嗯,我使用UITableView显示我的文本字段,我有25行 我想在此字段中显示来自我的数据库的数据,为此,我使用以下代码: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
- (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是一种犯罪强>
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的变化快。