В моем приложении мне нужно прочитать некоторые данные из БД, поэтому из любого вида я вызываю другой класс, содержащий все связанные с БД методы.Справочная задача SQLite
Один из этих методов делает запрос, как это:
query = [NSString stringWithFormat: @"select * from orari where idutente=%d and date(orario)=date('now','localtime') order by orario", idUtente];
Тогда я строю объект с данными из запроса и добавить все объекты в NSMutableArray, возвращенного этим методом.
Я опускаю весь код этого метода, потому что у меня нет проблем с этим, и чтобы вопрос стал яснее.
В таблице «orari» может быть до 18000 записей, и я заметил, что для выполнения этого запроса около 6000 записей для симулятора требуется около 4-6 секунд. Поэтому я думал о выполнении этого метода в фоновом порядке, так что основной поток не был бы заблокирован.
Так что я попытался с:
- (NSMutableArray *)NextGroup: (int)opt :(int)id {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^(void) {
....
here I execute my query, build the objects and add them all to my NSMutableArray
....
});
return myArray;
}
Теперь проблема заключается в том, что возвращение. Если я помещаю его в блок dispatch_async, я получаю ошибку: «несовместимые типы указателей блоков, передающие« NSMutableArray * (^) (void) »в параметр типа« dispatch_block_t »(aka« void (^) (void) ») ,
Если я поставлю его за пределы блока, он будет пустым.
Как передать этот NSMutableArray из блока методу, а затем обратно в представление, которое его вызвало?
Вы уверены, что хотите загрузить все данные сразу, главную нить или фон? Почему бы не загружать только идентификаторы строк и затем постепенно загружать партии, когда это необходимо? –
@LeoNatan Я не загружаю все данные. На самом деле всего несколько записей загружаются в объект, но для выбора тех записей я считаю, что запрос должен пройти через всю таблицу. – Aleph72
Предикат, который вы его передаете, эффективно обрабатывает данные. Но когда вы делаете «select *», все данные записи возвращаются в результате. Вы можете запросить только «_rowid_», а затем на основе этих идентификаторов строк запросить данные в пейджинге. –