为了账号安全,请及时绑定邮箱和手机立即绑定

对于失败的信号没有处理

- (void)setup {

    //定位

    _locationManager = [[DellocCLLocationManager alloc] init];

    _geoCoder = [[CLGeocoder alloc] init];

    _locationManager.delegate = self;

    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    _locationManager.distanceFilter = 1.0;

    _currentLocation=[[CLLocation alloc]initWithLatitude:31.232032 longitude:121.476173];

    

    @weakify(self);

    

    [[[[[self authorizedSignal] filter:^BOOL(id value) {

        return [value boolValue];

    }] flattenMap:^RACStream *(id value) {

         @strongify(self);

        return [[[[[[self rac_signalForSelector:@selector(locationManager:didUpdateLocations:) fromProtocol:@protocol(CLLocationManagerDelegate)] map:^id(id value) {

            CLLocation *firstLocation= [value[1] firstObject];

            CLLocationCoordinate2D coordinate = [JZLocationConverter wgs84ToGcj02:firstLocation.coordinate];

            CLLocation *correctLocation=[[CLLocation alloc]initWithLatitude:coordinate.latitude longitude:coordinate.longitude];

            return correctLocation;

        }] merge:[[self rac_signalForSelector:@selector(locationManager:didFailWithError:) fromProtocol:@protocol(CLLocationManagerDelegate)] map:^id(id value) {

            return [RACSignal error:value[1]];

        }]] take:1] initially:^{

            @strongify(self);

            [self.locationManager startUpdatingLocation];

        }] finally:^{

            @strongify(self);

            [self.locationManager stopUpdatingLocation];

        }];

    }] flattenMap:^RACStream *(id value) {

        

        if (![value isKindOfClass:[CLLocation class]]) {

            return  [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

                [subscriber sendNext:@"定位失败"];

                [subscriber sendCompleted];

                return [RACDisposable disposableWithBlock:^{

                    

                }];

            }];

        }

        CLLocation *firstLocation= value;

        return  [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

            @strongify(self);

            [self.geoCoder reverseGeocodeLocation:firstLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {

                if (error) {

                    [subscriber sendNext:error];

                }else{

                    [subscriber sendNext:[placemarks firstObject]];

                    [subscriber sendCompleted];

                }

            }];

            return [RACDisposable disposableWithBlock:^{

                

            }];

        }];

    }] subscribeNext:^(id x) {

        NSLog(@"%@",x);

    }];

}

http://img1.sycdn.imooc.com//58c351670001a59f08530468.jpg



正在回答

4 回答

这里判断不是 CLLocation 类型来判断的, 可以使用 sendError 。我也忘了录课时候为什么使用sendnext了。

0 回复 有任何疑惑可以回复我~

我这边这么处理的..

  RACSignal *locationSignal = [[[[self authorizedSignal] filter:^BOOL(id  _Nullable value) {

        //判断是否有权限

        return [value boolValue];

    }] flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value){

        //监听地址刷新的状态

        return [[[[[[self rac_signalForSelector:@selector(locationManager:didUpdateLocations:) fromProtocol:@protocol(CLLocationManagerDelegate)] map:^id _Nullable(id  _Nullable value) {

            return value[1];

            //混合错误监听

        }] merge:[[self rac_signalForSelector:@selector(locationManager:didFailWithError:) fromProtocol:@protocol(CLLocationManagerDelegate)] map:^id _Nullable(id  _Nullable value) {

            //返回错误

            return [RACSignal error:value[1]];

        }]] take:1] initially:^{

            //initially 在所有之前开始

            [self.manager startUpdatingLocation];

        }] finally:^{

            //finally 处理完之后

            [self.manager stopUpdatingLocation];

        }];

    }] flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {

        

        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {

            if ([[value class] isSubclassOfClass:[RACErrorSignal class]]) {

                [subscriber sendError:value];

            }else{

                CLLocation *location = [value firstObject];

                [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {

                    if (error) {

                        [subscriber sendError:error];

                    }else{

                        [subscriber sendNext:[placemarks firstObject]];

                        [subscriber sendCompleted];

                    }

                }];

            }

            return [RACDisposable disposableWithBlock:^{

            }];

        }];

    }];


0 回复 有任何疑惑可以回复我~

我用你的代码实验一下...走了啊..我把

locationManager:didUpdateLocations:

这个方法的时候你 return 的

correctLocation

这个位置的值直接用 @222 这么一个 NSNumber 类型替换了, 运行的时候走了定位失败...

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
iOS之ReactiveCocoa框架
  • 参与学习       6472    人
  • 解答问题       10    个

本iOS视频教程让你快速上手ReactiveCocoa框架,达到灵活运用

进入课程

对于失败的信号没有处理

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信