gpt4 book ai didi

ios - 等待网络调用完成

转载 作者:可可西里 更新时间:2023-11-01 04:44:52 24 4
gpt4 key购买 nike

我想要实现的是发出网络请求并等待它完成,这样我就可以决定下一步应该使用什么应用程序。通常我会避免这样的解决方案,但这种情况很少见,因为代码库有很多遗留问题,我们没有足够的时间应用必要的更改来纠正错误

我正在尝试使用以下定义编写一个简单的输入输出方法:

- (nullable id<UserPaymentCard>)validCardForLocationWithId:(ObjectId)locationId;

问题是,为了在这个方法中执行一些验证,我需要发出一个网络请求来接收必要的信息,所以我想等待这个请求完成。

我首先想到的是使用 dispatch_semaphore_t,所以我得到了这样的结果:

- (nullable id<UserPaymentCard>)validCardForLocationWithId:(ObjectId)locationId {
id<LocationsReader> locationsReader = [self locationsReader];

__block LocationStatus *status = nil;
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[locationsReader fetchLocationProviderStatusFor:locationId completion:^(LocationStatus * _Nonnull locationStatus) {
status = locationStatus;
dispatch_semaphore_signal(sema);
} failure:nil];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

return [self.paymentCards firstCardForStatus:status];
}

一切都编译并运行,但我的 UI 卡住并且我实际上从未收到信号量的信号。因此,我开始使用 dispatch_group_t,结果完全相同。

看起来我可能对代码的执行位置有一些问题,但我不知道如何解决这个问题并获得预期的结果。当我尝试将所有内容包装在 dispatch_async 中时,我实际上停止了阻塞主队列,但是 dispatch_async 立即返回,所以我在网络请求之前从该方法中返回完成。

我错过了什么?这实际上可以在没有一些 while hack 的情况下实现吗?还是我想和风车搏斗?


我能够通过以下解决方案实现我想要的,但它真的感觉像是一种 hacky 方式,而不是我喜欢在我的代码库中发布的东西。

- (nullable id<UserPaymentCard>)validCardForLocationWithId:(ObjectId)locationId {
id<LocationsReader> locationsReader = [self locationsReader];

__block LocationStatus *status = nil;
__block BOOL flag = NO;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[locationsReader fetchLocationProviderStatusFor:locationId completion:^(LocationStatus * _Nonnull locationStatus) {
status = locationStatus;
flag = YES;
} failure:nil];
});

while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) && !flag){};

return [self.paymentCards firstCardForStatus:status];
}

最佳答案

我猜 fetchLocationProviderStatusFor:completion:failure: 在主队列中调用这些回调。这就是你陷入僵局的原因。不可能。我们还不能进行时间​​旅行。

关于ios - 等待网络调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202667/

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