Как использовать FMDB в фоновом режиме с SQLCipher?

У меня проблемы с выполнением запросов в фоновом режиме.

Я загружаю JSON из Интернета, анализирую его с помощью Reskit и сохраняю массив объектов с помощью FMDB в свою базу данных sqlite3, зашифрованную с помощью SQLCipher.

Это пример:

FMDatabaseQueue *_queueSelect = [FMDatabaseQueue databaseQueueWithPath:[DataBaseController getPathBaseDatos]];

    [_queueSelect inDatabase:^(FMDatabase *db) {

        [db setKey:DATABASE_KEY];

        FMResultSet *existeConsulta = [db executeQuery:sql];
            while([existeConsulta next]) {

                [results addObject:[existeConsulta resultDictionary]];

            }
    }];

Я пытался использовать inTransaction и dispatch_async, но безуспешно.

Как правильно выполнить эту задачу?


person Kaisser    schedule 10.11.2015    source источник
comment
Что значит без успеха? Он работал успешно, но не асинхронно? (В этом есть смысл, поскольку этот фрагмент кода ничего не делает асинхронно.) Или он потерпел неудачу? Если это не удалось, проверяли ли вы коды возврата setKey и executeQuery? Были ли они TRUE и не nil соответственно? Если что-то не удалось, что было lastErrorMessage?   -  person Rob    schedule 10.11.2015


Ответы (1)


Чтобы запустить это асинхронно, FMDatabaseQueue не выполняет эту асинхронную операцию за вас, а просто предоставляет вам структуру, чтобы при взаимодействии с этой очередью из нескольких потоков взаимодействие было синхронизировано для вас.

Итак, можно (а) создать экземпляр одного FMDatabaseQueue объекта для всего приложения; и (б) если вы хотите запустить что-то асинхронно, вы должны запустить это из фоновой отправки или очереди операций.

Например:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT), ^{
    [_queueSelect inDatabase:^(FMDatabase *db) {
        // do your stuff here
    }];
});
person Rob    schedule 10.11.2015