gpt4 book ai didi

ios - NSRunLoop 有时会使应用程序无响应

转载 作者:行者123 更新时间:2023-11-28 22:05:34 25 4
gpt4 key购买 nike

在我的应用程序中,我需要对 restful web api 进行 https 调用并在返回时处理结果。同时服务调用的数量从来都不是固定的,因此相应地编写了相关代码。从服务获取的数据临时存储在应用程序内的 SQLite 数据库中。以下是它如何工作的结构。

当用户导航到需要获取数据的任何屏幕或其中的 UI 组件时, View Controller 会在其指定的模型对象上调用一个方法。然后此方法检查数据是否已存在于数据库中或是否需要获取。如果存在数据,它会将相同的数据返回给 View Controller 。否则,它发起异步服务请求并等待响应到来,然后将数据返回给VC。因此,VC 在调用指定模型之前初始化一个加载指示器,并在从该函数返回控制权后关闭它。

重要的是模型上的函数要等到从 web api 收到响应。这是通过注册 NSNotification 来完成的,一旦返回的数据写入数据库,服务模块就会发出该 NSNotification。一个 bool 变量,它在发出服务请求时设置为 false,在收到响应后设置为 true。 NSRunLoop 在此 bool 变量的错误条件下运行。因此,一旦变量设置为 true,其余的处理就可以继续。

以下是实现所有这些的相关代码片段:

[serviceModule initServiceCall:@"25" withDictionary:[NSDictionary dictionaryWithObjects:@[asOfDate] forKeys:@[@"toDate"]]];

dataReady=NO;

NSString *notificationName = @"dataReady";
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(useNotificationFromServiceModule:) name:notificationName object:nil];

NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (!dataReady && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

函数的其余部分在此之后继续。

这是处理通知的函数:

-(void)useNotificationFromServiceModule:(NSNotification *)notification {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
dataReady=YES;
});}

通常的过程是,一旦通知被发送,NSRunLoop 退出,方法的其余部分完成,返回到 View Controller , View Controller 随后关闭加载指示器。问题是有时这不会发生。发出通知时(我可以看到控制台日志),NSRunLoop 并没有结束。加载指示器继续出现在屏幕上并保持这种状态,直到屏幕被点击一次。点击屏幕时,NSRunLoop 结束,其余过程随机继续。

这并不总是发生。它是随机发生的,大约 10 次中有 4-5 次。请提供一些输入/指示以说明为什么会发生这种情况。

最佳答案

如果你直接使用run loop,要么很聪明要么很蠢。在第一种情况下,您会自己找到答案。在第二种情况下,如果您遵循与其他人相同的模式,即在后台线程上运行您的网络代码并在结果到达时使用 dispatch_async,情况会好得多。

关于ios - NSRunLoop 有时会使应用程序无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118229/

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