developer
2023-05-20 e12c7b4c22df631ebdcd16b2f98fbef8f738f92f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//
//  NSURLConnection+RACSupport.m
//  ReactiveCocoa
//
//  Created by Justin Spahr-Summers on 2013-10-01.
//  Copyright (c) 2013 GitHub, Inc. All rights reserved.
//
 
#import "NSURLConnection+RACSupport.h"
#import "RACDisposable.h"
#import "RACSignal.h"
#import "RACSubscriber.h"
#import "RACTuple.h"
 
@implementation NSURLConnection (RACSupport)
 
+ (RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest *)request {
    NSCParameterAssert(request != nil);
 
    return [[RACSignal
        createSignal:^(id<RACSubscriber> subscriber) {
            NSOperationQueue *queue = [[NSOperationQueue alloc] init];
            queue.name = @"org.reactivecocoa.ReactiveCocoa.NSURLConnectionRACSupport";
 
            [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                // The docs say that `nil` data means an error occurred, but
                // `nil` responses can also occur in practice (circumstances
                // unknown). Consider either to be an error.
                //
                // Note that _empty_ data is not necessarily erroneous, as there
                // may be headers but no HTTP body.
                if (response == nil || data == nil) {
                    [subscriber sendError:error];
                } else {
                    [subscriber sendNext:RACTuplePack(response, data)];
                    [subscriber sendCompleted];
                }
            }];
 
            return [RACDisposable disposableWithBlock:^{
                // It's not clear if this will actually cancel the connection,
                // but we can at least prevent _some_ unnecessary work --
                // without writing all the code for a proper delegate, which
                // doesn't really belong in RAC.
                queue.suspended = YES;
                [queue cancelAllOperations];
            }];
        }]
        setNameWithFormat:@"+rac_sendAsynchronousRequest: %@", request];
}
 
@end