NSURLConnection+RACSupport.m 1.8 KB

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