ios - 为什么使用 NSURLConnection sendAsynchronousRequest 建立与数据库的连接会延迟?

标签 ios objective-c nsurlconnection

对不起,我不知道这一点,但我想知道为什么我尝试建立与数据库的连接时会出现延迟。

我基本上是从数据库中提取数据以将信息显示回 UITableView,但连接建立似乎有延迟。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self fetchFromDatabase];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    [self fetchFromDatabase];
    
    NSLog(@"FOUR");
}

- (void)fetchFromDatabase
{
    // The URL of the database
    NSURL *url = [[NSURL alloc] initWithString:SDTET_DATABASE_SCHEDULE];
    
    // Establish the connection to the database
    [NSURLConnection sendAsynchronousRequest:[ [NSURLRequest alloc] initWithURL:url] queue:[ [NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {
         NSLog(@"ONE !");
     } ];
}

但是,输出看起来像这样:

FOUR

FOUR

ONE !

为什么 ONE ! 没有先打印出来?

如果可能,如何确保在调用 numberOfSections 之前发生连接?

谢谢

最佳答案

ONE 最后打印,因为您正在调用异步方法。

您可以遵循程序的流程(哪个方法按什么顺序调用哪个)。如果让我们的想象力稍微延伸一下,我们可以说当一个方法是同步的时,它基本上“说”到下一行代码等待它(方法)完成。 但是,如果一个方法是异步的,它会说“不要等我”。您使用的 URL 请求方法是异步的。这意味着它开始执行它的工作但没有人等待,代码的执行在下一行立即继续。

Asynchronous method in code

拼图中有一 block 可以进一步阐明这一点。请求方法需要提供一个完成 block 作为参数。解释 block 超出了此处的范围,但您需要了解 block 是什么才能完全掌握问题的解决方案。 可以这么说,一旦这个异步方法完成它的工作(这可能需要很长时间,this 确实是异步方法的原因之一), block 就会被调用并执行。 Block in the method

因此,要回答您的最后一个问题,您需要触发 TableView 的刷新,您可以通过调用 [self.tableView reloadData]; inside block 。这里有一个很好的逻辑,因为您知道该 block 仅在异步方法完成其工作后才执行,您将刷新您的 TableView ,知道您有来自 db 的更新数据。

关于ios - 为什么使用 NSURLConnection sendAsynchronousRequest 建立与数据库的连接会延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28444933/

相关文章:

ios - EasyAPNS 配置

ios - 如何通过子类化UIButton获得按钮的背景图像名称?

Objective-c执行选择器: vs performSelector:withObject

ios - 在 iOS 上发送 HTTP POST 请求并从服务器接收响应

iphone - NSURLConnection 未启动

iphone - 将 NSString 转换为 const char *

ios - 将 NSString 变量从 UIView 传递到 UITableView

ios - map 上的折线不可见

objective-c - 如何删除文件夹中的所有文件,但不删除文件夹本身?

objective-c - 将部分 UTF-8 解码为 NSString