ReactiveCocoa 链接网络操作失败
ReactiveCocoa chaining network operations failed
我尝试用ReactiveCocoa做网络操作链,但是失败了。我不知道我的代码有什么问题。
- (RACSignal *)pg_findObjectsInBackground {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[self findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error) {
[subscriber sendError:error];
return;
}
[subscriber sendNext:objects];
[subscriber sendCompleted];
}];
return [RACDisposable disposableWithBlock:^{
[self cancel];
}];
}];
}
- (RACSignal *)pg_countObjectsInBackground {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[self countObjectsInBackgroundWithBlock:^(int number, NSError *error) {
if (error) {
[subscriber sendError:error];
return;
}
[subscriber sendNext:@(number)];
[subscriber sendCompleted];
}];
return [RACDisposable disposableWithBlock:^{
[self cancel];
}];
}];
}
__block NSError *_error;
@weakify(self)
[[[self.query pg_countObjectsInBackground]flattenMap:^RACStream *(NSNumber *count) {
@strongify(self)
self.totalCount = [count integerValue];
// Second, fetch experiences
self.query.limit = self.pageSize;
self.query.skip = self.pageSize * self.currentPage;
return [self.query pg_findObjectsInBackground];
}]subscribeNext:^(NSArray *experiences) {
@strongify(self)
[self.experiences removeAllObjects];
[self.experiences addObjectsFromArray:experiences];
} error:^(NSError *error) {
_error = error;
} completed:^{
@strongify(self)
if (finishBlock) {
finishBlock(self, _error);
}
}];
第一次请求成功。但是我一return[self.query pg_findObjectsInBackground]
,就直接去disposableWithBlock
因为您对计数和查找对象操作使用相同的 PFQuery
对象,所以当您从 flattenMap
方法 return 时,查询将被取消。 flattenMap
订阅了新信号(这是同一个信号),我认为这会导致一次性装置发射。一个简单的解决方案是在 flattenMap
块中构建一个新的 PFQuery
和 return。
我假设你正在使用 Parse,如果你是,你应该标记它。
我尝试用ReactiveCocoa做网络操作链,但是失败了。我不知道我的代码有什么问题。
- (RACSignal *)pg_findObjectsInBackground {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[self findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error) {
[subscriber sendError:error];
return;
}
[subscriber sendNext:objects];
[subscriber sendCompleted];
}];
return [RACDisposable disposableWithBlock:^{
[self cancel];
}];
}];
}
- (RACSignal *)pg_countObjectsInBackground {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[self countObjectsInBackgroundWithBlock:^(int number, NSError *error) {
if (error) {
[subscriber sendError:error];
return;
}
[subscriber sendNext:@(number)];
[subscriber sendCompleted];
}];
return [RACDisposable disposableWithBlock:^{
[self cancel];
}];
}];
}
__block NSError *_error;
@weakify(self)
[[[self.query pg_countObjectsInBackground]flattenMap:^RACStream *(NSNumber *count) {
@strongify(self)
self.totalCount = [count integerValue];
// Second, fetch experiences
self.query.limit = self.pageSize;
self.query.skip = self.pageSize * self.currentPage;
return [self.query pg_findObjectsInBackground];
}]subscribeNext:^(NSArray *experiences) {
@strongify(self)
[self.experiences removeAllObjects];
[self.experiences addObjectsFromArray:experiences];
} error:^(NSError *error) {
_error = error;
} completed:^{
@strongify(self)
if (finishBlock) {
finishBlock(self, _error);
}
}];
第一次请求成功。但是我一return[self.query pg_findObjectsInBackground]
,就直接去disposableWithBlock
因为您对计数和查找对象操作使用相同的 PFQuery
对象,所以当您从 flattenMap
方法 return 时,查询将被取消。 flattenMap
订阅了新信号(这是同一个信号),我认为这会导致一次性装置发射。一个简单的解决方案是在 flattenMap
块中构建一个新的 PFQuery
和 return。
我假设你正在使用 Parse,如果你是,你应该标记它。