Это вполне возможно, вам просто нужно сериализовать доступ к SQLite в фоновом потоке.
Мой ответ на этот недавний вопрос должен указать вам правильное направление, я думаю.
Как упоминалось в другом месте, SQLite отлично подходит для одновременного чтения, но блокирует на уровне базы данных для записи. Это означает, что если вы читаете и пишете в разных потоках, вы получите ошибки SQLITE_BUSY и SQLITE_LOCKED.
Самый простой способ избежать этого - сериализовать все доступ к БД (чтение и запись) либо в очереди отправки, либо NSOperationQueue
с параллелизмом 1. Поскольку этот доступ не требуется место в основном потоке, ваш пользовательский интерфейс не будет затронут.
Это, очевидно, остановит перекрывающиеся операции чтения и записи, но также остановит одновременные операции чтения. Непонятно, удастся ли это удар по производительности или нет.
Чтобы инициализировать очередь, как описано выше:
NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
[backgroundQueue setMaxConcurrentOperationCount:1];
Тогда вы можете просто добавлять операции в очередь по своему усмотрению.