gpt4 book ai didi

objective-c - 在重试之前使用 Reactive Cocoa/Inject side effect 重试警报

转载 作者:搜寻专家 更新时间:2023-10-30 20:05:24 26 4
gpt4 key购买 nike

我刚刚开始研究 Reactive Cocoa,我认为我目前使用的许多应用程序中的一个场景应该是一个很好的起点。当应用程序启动时,它会在让用户进入应用程序之前检查用户当前是否在白名单国家/地区。所以完美的顺序应该是这样的:

  1. 使用 Core Location 检查设备位置。
  2. 使用 CLGeocoder 对位置进行反向编码。
  3. 将国家代码与白名单进行比较。
  4. 继续加载应用。

如果 (1) 失败,我想通知用户必须使用带有单个重试按钮的 UIAlertView 启用定位服务。这就是我似乎无法理解应该如何完成的地方。当前代码如下:

@weakify( self )
[[[[[[self
findLocation]
doError:^( NSError *error ) {
@strongify( self )
// There was an error fetching the location so we ask
// the user to enable location services.
//
[self askUserToEnableLocationServices];
}]
retry] // What do we really retry here? It doesn't seem like it's [self findLocation]
flattenMap:^RACStream *( CLLocation *newLocation ) {
@strongify( self )
return [self reverseGeocodeLocation:newLocation];
}]
flattenMap:^RACStream *( NSString *ISOCountryCode ) {
@strongify( self )
return [self checkCountryPermissibleSignal:ISOCountryCode];
}]
subscribeNext:^( id x ) {
NSLog( @"Country is valid!" );
} error:^( NSError *error ) {
NSLog( @"Error: %@", error );
}];

有人对此有任何意见吗?我猜我对 retry 的工作方式有误。我还怀疑我对整个流程的外观有点天真。但是我已经坚持了几个晚上了。有一些东西还没有被点击。

最佳答案

刚刚注意到您在 SO 上问过这个问题。 I posted a reply on the GitHub repo ,但为了后代,我也会在这里发布我的答案:

@weakify( self )
[[[[[[self
findLocation]
doError:^( NSError *error ) {
@strongify( self )
// There was an error fetching the location so we ask
// the user to enable location services.
//
[self askUserToEnableLocationServices];
}]
retry] // What do we really retry here? It doesn't seem like it's [self findLocation]

-retry 不会再次调用 [self findLocation]。相反,它会创建对从 [self findLocation] 返回的 RACSignal 对象的新订阅。原始订阅已被处理,因为根据发送错误时信号如何操作的契约(Contract)/语义传递了错误。

请注意,您对 -doError: 的调用中的代码将与新订阅同时执行,这可能不是您想要的。换句话说,当您向用户显示警报 View 时,您同时在用户有机会采取任何操作之前重新订阅从 -findLocation 返回的信号。

您可以使用 -catchTo: 指定一个替代信号,如果在原始信号上传递错误,则应订阅该替代信号:

@weakify( self )
RACSignal *recover = [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
@strongify( self );
[self askTheUserToEnableLocationServices]
return nil;
}];

[[[[[self
findLocation]
catchTo:recover]
flattenMap:^RACStream *( CLLocation *newLocation ) {
@strongify( self )
return [self reverseGeocodeLocation:newLocation];
}]
flattenMap:^RACStream *( NSString *ISOCountryCode ) {
@strongify( self )
return [self checkCountryPermissibleSignal:ISOCountryCode];
}]
subscribeNext:^( id x ) {
NSLog( @"Country is valid!" );
} error:^( NSError *error ) {
NSLog( @"Error: %@", error );
}];

关于objective-c - 在重试之前使用 Reactive Cocoa/Inject side effect 重试警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24381961/

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