асинхронные вызовы базы данных в ios - PullRequest
1 голос
/ 03 октября 2011

У меня в приложении iPAD 4 UITableView. Я загружаю данные на них с помощью функции loadData, которая есть во всех 4 файлах TableViewController.m, которая выполняет вызовы в базу данных.

Итак, я бы делал что-то вроде этого

[aView loadData];
[bView loadData];
[cView loadData];
[dView loadData];

Где aView, bView, cView и dView являются контроллерами представления UITableView.

Однако вызовы базы данных происходят синхронно и, следовательно, только после извлечения данных из функции [aView loadData] вызывается функция [bView loadData] и т. Д.

Это влияет на мою производительность.

Я хотел бы знать, есть ли способ, которым я могу асинхронно совершать вызовы к базе данных / асинхронно вызывать функции, которые вызывают базу данных.

Было бы здорово, если бы кто-то мог помочь мне с этим.

1 Ответ

9 голосов
/ 03 октября 2011

Вы можете использовать GCD для этого:

-(void)loadList
{
   // You ma do some UI stuff
   [self.activityIndicator startAnimating]; // for example if you have an UIActivityIndicator to show while loading

   // Then dispatch the fetching of the data from database on a separate/paralle queue asynchronously (non-blocking)
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      // this is executed on the concurrent (parallel) queue, asynchronously
      ... do your database requests, fill the model with the data

      // then update your UI content.
      // *Important*: Updating the UI must *always* be done on the main thread/queue!
      dispatch_sync(dispatch_get_main_queue(), ^{
          [self.activityIndicator stopAnimating]; // for example
          [self.tableView reloadData];
      });
   });
}

Затем, когда вы вызовете метод loadList, ActivityIndicator начнет анимироваться, и процесс извлечения ваших данных будет запущен в отдельной очереди асинхронно, но метод loadList вернется немедленно (не ожидая блока в dispatch_async чтобы закончить выполнение, вот для чего dispatch_async).

Таким образом, все ваши вызовы ваших реализаций 4 loadList в каждом из ваших контроллеров представления будут выполняться немедленно (вызывая асинхронную выборку ваших данных, но не ожидая получения данных). Как только запросы к базе данных - которые выполнялись в параллельной очереди - завершились одним из ваших методов loadList, выполняется строка dispatch_sync(...) в конце блока, запрашивающая основную очередь (основной поток) выполнить код для обновления пользовательского интерфейса и отображения недавно загруженных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...