【问题标题】:asynchronous calls to database in iosios中对数据库的异步调用
【发布时间】:2011-10-03 17:47:41
【问题描述】:

我的 iPAD 应用程序上有 4 个 UITableView。 我使用函数 loadData 将数据加载到它们上,该函数存在于所有 4 个 TableViewController.m 文件中,它调用数据库。

所以,我会做这样的事情

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

其中aView、bView、cView和dView是UITableView的视图控制器。

但是,数据库调用是同步发生的,因此只有在从 [aView loadData] 函数检索到数据之后,才会调用 [bView loadData] 函数等等。

这会影响我的表现。

我想知道是否有一种方法可以异步调用数据库/异步调用调用数据库的函数。

如果有人能帮我解决这个问题,那就太好了。

【问题讨论】:

    标签: uitableview core-data asynchronous ios4


    【解决方案1】:

    您可以为此使用 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方法时,activityIndi​​cator会启动animate,你的数据的获取过程会在一个单独的队列上异步启动,但是loadList方法会立即返回(不等待块在dispatch_async 完成执行,这就是 dispatch_async 的用途。

    因此,您对每个视图控制器中的 4 个 loadList 实现的所有调用都将立即执行(触发异步获取数据,但不等待检索数据)。一旦数据库请求 - 在并行队列中执行 - 在您的 loadList 方法之一中完成,块末尾的 dispatch_sync(...) 行将被执行,要求主队列(主线程)执行一些代码来刷新 UI 并显示新加载的数据。

    【讨论】:

    • 我已经编辑了我的答案并添加了一些细节。是的,您应该在每个更好的loadData 函数中添加这段代码(或者您可以将loadData 调用与dispatch_async(...) 括在调用者代码中,但这不会很好和可读,而且是 ViewController 触发其关联视图更新的责任,因此这是他们调用 [self.tableView reloadData]) 的工作。
    • 第二个问题:我的代码中的主队列是使用dispatch_get_main_queue() 函数检索的。阅读Concurrency Programming Guide 了解有关 Grand Central Dispatch (GCD) 和调度队列的更多信息
    • 效果很好。我想问另一个重要的事情。在我的 loadData 函数中,我调用了 web 服务。所以我要做的是,如果我的数据库中没有任何内容,我会调用 web 服务。使用此异步函数时,会发生对 WS 的调用,但之后什么也没有发生。我做错了什么?
    • 您如何进行网络服务调用?使用NSURLConnection 及其异步API?如果是这样,这是一个很好的解决方案,但要知道,当使用NSURLConnectionconnectionWithRequest: 启动请求时,该请求被安排在调用它的线程的 NSRunLoop 上,以便正确处理。我想这是你的下载没有发生的原因(如果它之前工作过)......所以基本上我想你应该设置一个运行循环或更简单地在主线程上调用你的 web 服务(如果你使用这不是问题NSURLConnection的异步API)
    • 是的,我正在使用 NSURLConnection。所以当你再次说在主线程上调用你的 web 服务时,这意味着在 dispatch_async 的右括号之后......我是对的吗?
    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2019-11-29
    • 2012-07-19
    相关资源
    最近更新 更多