ReactiveCocoa 相当新,我正在尝试构建一个信号,该信号从客户端必须首先对其进行身份验证的远程 API 异步获取一些资源。通过首先从 API 获取令牌,然后通过一些自定义 HTTP 标头为每个后续请求传递它来处理身份验证。但是,可能会在订阅 fetchResource 信号后设置自定义标头,这在当前情况下会导致未经身份验证的请求。我想我实际上可以在 self.authenticationStatus 的 subscribeNext 块中构建请求,从而确保设置令牌,但是我该如何处理信号的处置呢?
- (RACSignal *)fetchResource
{
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSURLRequest *request = [self.requestSerializer
requestWithMethod:@"GET"
URLString:[[NSURL URLWithString:@"resource" relativeToURL:self.baseURL] absoluteString]
parameters:nil error:nil];
NSURLSessionDataTask *task = [self dataTaskWithRequest:request
completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
[subscriber sendError:error];
} else {
[subscriber sendNext:responseObject];
[subscriber sendCompleted];
}
}];
// Actually trigger the request only once the authentication token has been fetched.
[[self.authenticationStatus ignore:@NO] subscribeNext:^(id _) {
[task resume];
}];
return [RACDisposable disposableWithBlock:^{
[task cancel];
}];
}];
}