gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:31:29 26 4
gpt4 key购买 nike

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

我基本上是从数据库中提取数据以将信息显示回 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com