iOS领域-保存数据时CPU过载和阻止UI
我有一个应用程序使用Realm在设备上保存一些数据。当我需要保存一个大的列表(9k对象)时,我的应用程序会阻塞UI,CPU会在10分钟内达到130%。我试图将save方法设置为main thread,但UI仍然阻塞。有人能帮忙吗?我希望事务不会阻塞UI,需要在后台执行 我使用此方法将对象保存到领域数据库。它接收参与者列表,我在保存前检查对象是否存在于我的数据库中iOS领域-保存数据时CPU过载和阻止UI,ios,objective-c,realm,Ios,Objective C,Realm,我有一个应用程序使用Realm在设备上保存一些数据。当我需要保存一个大的列表(9k对象)时,我的应用程序会阻塞UI,CPU会在10分钟内达到130%。我试图将save方法设置为main thread,但UI仍然阻塞。有人能帮忙吗?我希望事务不会阻塞UI,需要在后台执行 我使用此方法将对象保存到领域数据库。它接收参与者列表,我在保存前检查对象是否存在于我的数据库中 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DE
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (Participante *p in participantes) {
Participante *dbParticipante = [weakSelf fetchParticipanteById:p.identification];
if(dbParticipante) {
[dbParticipante setIdIngresso:p.idIngresso];
[dbParticipante setIdentification:p.identification];
[dbParticipante setIdCortesia:p.idCortesia];
[dbParticipante setIdEvento:p.idEvento];
[dbParticipante setNome:p.nome];
[dbParticipante setDocumentoNumero:p.documentoNumero];
[dbParticipante setCodigoIngresso:p.codigoIngresso];
[dbParticipante setTipoIngresso:p.tipoIngresso];
[dbParticipante save];
} else {
[p setSync:YES];
[p save];
}
}
});
我使用此方法保存:
- (void)saveParticipante:(Participante *)participante {
[self writeTransactionWithWriteBlock:^(YSRealmWriteTransaction *transaction, RLMRealm *realm) {
ParticipanteRealm *realmObject = [[ParticipanteRealm alloc] initWithMantleModel:participante];
[realm addOrUpdateObject:realmObject];
}];
}
- (void)writeTransactionWithWriteBlock:(TransactionWriteBlock)writeBlock {
RLMRealm *realm = [self realm];
[realm beginWriteTransaction];
if (writeBlock) writeBlock(self, realm);
if (self.isCancelled) {
[realm cancelWriteTransaction];
} else {
[realm commitWriteTransaction];
}
}
我更改了方法save以将所有对象持久化到同一事务中,但仍然阻止了UI。CPU获得了小的提升:90%
- (void)saveParticipante3:(NSMutableArray *)participanteList {
[self writeTransactionWithWriteBlock:^(YSRealmWriteTransaction *transaction, RLMRealm *realm) {
for (Participante *p in participanteList) {
ParticipanteRealm *realmObject = [[ParticipanteRealm alloc] initWithMantleModel:p];
[realm addOrUpdateObject:realmObject];
}
} completion:^(YSRealmStore *store, YSRealmWriteTransaction *transaction, RLMRealm *realm) {
}];
}请显示保存方法实现。cpu负载是否恢复正常?如果没有,那么在某个地方有一个无限循环在运行!请发布导致CPU过载的相关代码!您缺少两条非常重要的信息:1)如果您在后台线程上执行写操作,为什么主线程会被阻塞?从主线程被阻止的点开始的回溯应该揭示这里发生了什么。2) 在写过程中,CPU花费的时间是多少?一个instruments时间配置文件跟踪应该可以揭示这里发生了什么。在你的代码中有一个反模式向我跳出来,那就是你在一个循环中执行写事务,所以每个参与者都会导致一个单独的写事务被打开然后提交。您应该在单个写事务中执行所有修改。这不一定能解决你看到的具体问题,但它将大大加快您执行的修改速度,因为它减少了单个实例的每次提交开销,而不是每个参与者只执行一次。@TejaNandamuri我用代码更新了save请显示save方法实现。cpu负载是否恢复正常?如果没有,那么在某个地方有一个无限循环在运行!请发布导致CPU过载的相关代码!您缺少两条非常重要的信息:1)如果您在后台线程上执行写操作,为什么主线程会被阻塞?从主线程被阻止的点开始的回溯应该揭示这里发生了什么。2) 在写过程中,CPU花费的时间是多少?一个instruments时间配置文件跟踪应该可以揭示这里发生了什么。在你的代码中有一个反模式向我跳出来,那就是你在一个循环中执行写事务,所以每个参与者都会导致一个单独的写事务被打开然后提交。您应该在单个写事务中执行所有修改。这不一定能解决您所看到的特定问题,但它会显著加快您执行的修改,因为它减少了单个实例的每次提交开销,而不是每个参与者只执行一次。@TejaNandamuri我用要保存的代码进行了更新