- (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);
}];
}

这里判断不是 CLLocation 类型来判断的, 可以使用 sendError 。我也忘了录课时候为什么使用sendnext了。
我这边这么处理的..
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:^{
}];
}];
}];
和你不太一样的地方就是我把你手动该的 RACStream 的返回值改成了 id 下面贴上我的代码吧:
- (void)setup {
//定位
_locationManager = [[CLLocationManager 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:^id (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 = firstLocation.coordinate;
CLLocation *correctLocation=[[CLLocation alloc]initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
return @(22);
}] merge:[[self rac_signalForSelector:@selector(locationManager:didFailWithError:) fromProtocol:@protocol(CLLocationManagerDelegate)] map:^id(id value) {
return [RACSignal error:value[1]];
}]] take:1] initially:^{
@strongify(self);
[_locationManager startUpdatingLocation];
}] finally:^{
@strongify(self);
[_locationManager stopUpdatingLocation];
}];
}] flattenMap:^id (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);
[_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);
}];
}我用你的代码实验一下...走了啊..我把
locationManager:didUpdateLocations:
这个方法的时候你 return 的
correctLocation
这个位置的值直接用 @222 这么一个 NSNumber 类型替换了, 运行的时候走了定位失败...