2013-10-14 3 views
0

В моем приложении мне нужно прочитать некоторые данные из БД, поэтому из любого вида я вызываю другой класс, содержащий все связанные с БД методы.Справочная задача 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 из блока методу, а затем обратно в представление, которое его вызвало?

+0

Вы уверены, что хотите загрузить все данные сразу, главную нить или фон? Почему бы не загружать только идентификаторы строк и затем постепенно загружать партии, когда это необходимо? –

+0

@LeoNatan Я не загружаю все данные. На самом деле всего несколько записей загружаются в объект, но для выбора тех записей я считаю, что запрос должен пройти через всю таблицу. – Aleph72

+0

Предикат, который вы его передаете, эффективно обрабатывает данные. Но когда вы делаете «select *», все данные записи возвращаются в результате. Вы можете запросить только «_rowid_», а затем на основе этих идентификаторов строк запросить данные в пейджинге. –

ответ

0

Хорошо, думаю, я понял. Я просто не уверен, что это лучший способ сделать это:

- (NSMutableArray *)NextGroup: (int)opt :(int)id { 
__block NSMutableArray *myArray = [NSMutableArray alloc] init]; 
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; 
} 

Как вы видите, я объявил блок массива вне блока, а затем я вернуть его за его пределами. Он работает, но лучший способ это сделать?

Смежные вопросы