Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.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领域-保存数据时CPU过载和阻止UI_Ios_Objective C_Realm - Fatal编程技术网

iOS领域-保存数据时CPU过载和阻止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

我有一个应用程序使用Realm在设备上保存一些数据。当我需要保存一个大的列表(9k对象)时,我的应用程序会阻塞UI,CPU会在10分钟内达到130%。我试图将save方法设置为main thread,但UI仍然阻塞。有人能帮忙吗?我希望事务不会阻塞UI,需要在后台执行

我使用此方法将对象保存到领域数据库。它接收参与者列表,我在保存前检查对象是否存在于我的数据库中

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我用要保存的代码进行了更新