Сбой сетевых операций цепочки ReactiveCocoa

Я пытался использовать 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);
        }
    }];

Первый запрос прошел успешно. Но как только я возвращаю [self.query pg_findObjectsInBackground], он сразу переходит к disposableWithBlock.


person Henry H Miao    schedule 22.04.2015    source источник


Ответы (1)


Поскольку вы используете один и тот же объект PFQuery как для подсчета, так и для операции поиска объекта, запрос отменяется, когда вы возвращаетесь из метода flattenMap. flattenMap подписывается на новый сигнал (это тот же сигнал), который, как я полагаю, вызывает срабатывание одноразового устройства. Простое решение — построить новый PFQuery и вернуть его в блоке flattenMap.

Я предположил, что вы используете Parse, и если это так, вы должны пометить его.

person hhanesand    schedule 24.04.2015