AFHTTPSessionManager+RACSupport.m 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //
  2. // AFHTTPSessionManager+RACSupport.m
  3. // Reactive AFNetworking Example
  4. //
  5. // Created by Robert Widmann on 5/20/14.
  6. // Copyright (c) 2014 CodaFi. All rights reserved.
  7. //
  8. #if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090)
  9. #import "AFHTTPSessionManager+RACSupport.h"
  10. NSString *const RACAFNResponseObjectErrorKey = @"responseObject";
  11. @implementation AFHTTPSessionManager (RACSupport)
  12. - (RACSignal *)rac_GET:(NSString *)path parameters:(id)parameters {
  13. return [[self rac_requestPath:path parameters:parameters method:@"GET"]
  14. setNameWithFormat:@"%@ -rac_GET: %@, parameters: %@", self.class, path, parameters];
  15. }
  16. - (RACSignal *)rac_HEAD:(NSString *)path parameters:(id)parameters {
  17. return [[self rac_requestPath:path parameters:parameters method:@"HEAD"]
  18. setNameWithFormat:@"%@ -rac_HEAD: %@, parameters: %@", self.class, path, parameters];
  19. }
  20. - (RACSignal *)rac_POST:(NSString *)path parameters:(id)parameters {
  21. return [[self rac_requestPath:path parameters:parameters method:@"POST"]
  22. setNameWithFormat:@"%@ -rac_POST: %@, parameters: %@", self.class, path, parameters];
  23. }
  24. - (RACSignal *)rac_POST:(NSString *)path parameters:(id)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block {
  25. return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {
  26. NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:path relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:nil];
  27. NSURLSessionDataTask *task = [self dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
  28. if (error) {
  29. NSMutableDictionary *userInfo = [error.userInfo mutableCopy];
  30. if (responseObject) {
  31. userInfo[RACAFNResponseObjectErrorKey] = responseObject;
  32. }
  33. NSError *errorWithRes = [NSError errorWithDomain:error.domain code:error.code userInfo:[userInfo copy]];
  34. [subscriber sendError:errorWithRes];
  35. } else {
  36. [subscriber sendNext:RACTuplePack(responseObject, response)];
  37. [subscriber sendCompleted];
  38. }
  39. }];
  40. [task resume];
  41. return [RACDisposable disposableWithBlock:^{
  42. [task cancel];
  43. }];
  44. }] setNameWithFormat:@"%@ -rac_POST: %@, parameters: %@, constructingBodyWithBlock:", self.class, path, parameters];
  45. ;
  46. }
  47. - (RACSignal *)rac_PUT:(NSString *)path parameters:(id)parameters {
  48. return [[self rac_requestPath:path parameters:parameters method:@"PUT"]
  49. setNameWithFormat:@"%@ -rac_PUT: %@, parameters: %@", self.class, path, parameters];
  50. }
  51. - (RACSignal *)rac_PATCH:(NSString *)path parameters:(id)parameters {
  52. return [[self rac_requestPath:path parameters:parameters method:@"PATCH"]
  53. setNameWithFormat:@"%@ -rac_PATCH: %@, parameters: %@", self.class, path, parameters];
  54. }
  55. - (RACSignal *)rac_DELETE:(NSString *)path parameters:(id)parameters {
  56. return [[self rac_requestPath:path parameters:parameters method:@"DELETE"]
  57. setNameWithFormat:@"%@ -rac_DELETE: %@, parameters: %@", self.class, path, parameters];
  58. }
  59. #pragma mark - 私有方法
  60. - (RACSignal *)rac_requestPath:(NSString *)path parameters:(id)parameters method:(NSString *)method {
  61. return [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
  62. /// 获取request
  63. NSURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:path relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil];
  64. ///
  65. NSURLSessionDataTask *task = [self dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
  66. if (error) {
  67. NSMutableDictionary *userInfo = [error.userInfo mutableCopy];
  68. if (responseObject) {
  69. userInfo[RACAFNResponseObjectErrorKey] = responseObject;
  70. }
  71. NSError *errorWithRes = [NSError errorWithDomain:error.domain code:error.code userInfo:[userInfo copy]];
  72. [subscriber sendError:errorWithRes];
  73. } else {
  74. [subscriber sendNext:RACTuplePack(responseObject, response)];
  75. [subscriber sendCompleted];
  76. }
  77. }];
  78. [task resume];
  79. return [RACDisposable disposableWithBlock:^{
  80. [task cancel];
  81. }];
  82. }];
  83. }
  84. @end
  85. #endif