вопрос блокировки sqlite в iOS - PullRequest
1 голос
/ 17 ноября 2011

Моя база данных Sqlite доступна из различных потоков в моем коде, из-за чего у меня возникает много проблем с блокировкой базы данных.

Чтобы преодолеть проблему блокировки, я запрашиваю БД только в основном потоке.Недостатком этого является то, что мой основной поток занят, если выполняется много запросов.

Я хочу написать механизм, в котором все вызовы БД выполняются из одного места (во вторичном потоке), чтобыон может быть синхронизирован, и вызывающий может звонить из любого потока.

Может быть, если какой-либо модуль захочет выполнить запрос, он будет проверять из основного класса синхронизации БД, занята ли БД или свободна для выполненияtask.

Примечание : - В моей текущей реализации я открываю и закрываю БД каждый раз, когда хочу выполнить запрос.Будет ли это иметь какое-либо влияние на производительность?

Любая подсказка в правильном направлении будет высоко оценена.

1 Ответ

2 голосов
/ 17 ноября 2011

Повторное открытие базы данных, конечно, займет больше времени, чем ее сохранение.Однако это может не занять заметное количество времени.

Я предлагаю вам создать очередь Grand Central Dispatch и использовать ее для любого доступа к базе данных.Вот как вы его создаете:

// The queue needs to be a global variable, or globally accessible in some way.
dispatch_queue_t dbQueue;
// Make your sqlite3 connection global too.
sqlite3 *dbConnection;

// In your application delegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // usual initialization ...
    ...
    int rc = sqlite3_open(dbFilename, &dbConnection);
    if (rc != SQLITE_OK)
        handleDbError(rc, dbConnection);
    dbQueue = dispatch_queue_create("dbQueue", DISPATCH_QUEUE_SERIAL);
    ...
}

Вот как вы его используете:

dispatch_queue_async(dbQueue, ^{
    // This block runs off the main thread, and does not run simultaneously
    // with any other blocks submitted to `dbQueue`.
    NSString *result = executeDatabaseQuery();

    dispatch_queue_async(dispatch_get_main_queue(), ^{
        // This block runs on the main thread.
        [(MyAppDelegate *)[UIApplication delegate] presentResult:result];
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...