2016-01-29 35 views
20

jaki sposób można uzyskać ciąg reakcji z bloku awaria AFNetworking 3.xget responseObject o awarii bloku AFNetworking 3,0

W wersji 2.x droga do zrobienia było:

[manager GET:path parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSDictionary *dictionary_FetchResult = responseObject; 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSDictionary *dictionary_FetchResult = operation.responseObject; 
}]; 

ale w wersji 3.x nie jest obsługiwany w parametrze powracających bloku, jak pokazano poniżej:

[manager POST:path parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { 
     } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
    NSDictionary *dictionary_FetchResult = responseObject; 
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    NSLog(@"Error: %@", error); 
}]; 

więc miałem nadzieję, jeśli ktoś był w stanie osiągnąć.

Odpowiedz

43

Wystarczy zrobić to w bloku błędu: -

NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",errResponse); 

Dla Swift: -

var errResponse: String = String(data: (error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as! NSData), encoding: NSUTF8StringEncoding) 
NSLog("%@", errResponse) 

Aktualizacja dla Swift 4.1

var errResponse: String = String(data: (error._userInfo![AFNetworkingOperationFailingURLResponseDataErrorKey] as! Data), encoding: String.Encoding.utf8)! 
print(errResponse) 
+0

co zrobić w szybkim tempie? – Max

+0

co jeśli chcę pobrać obraz z adresu URL ios ​​ –

+1

To działa dla mnie Niż za tę odpowiedź ... !! –

5

Znalazłem rozwiązanie dla tego, które działa s doskonale. W szybki

if let userInfo : NSDictionary = error.userInfo as NSDictionary { 
    if let innerError : NSError = userInfo.objectForKey("NSUnderlyingError") as? NSError { 

     if let innerUserInfo : NSDictionary = innerError.userInfo as NSDictionary { 

       if innerUserInfo.objectForKey(AFNetworkingOperationFailingURLResponseDataErrorKey) != nil { 
        let StrError = NSString(data: innerUserInfo.objectForKey(AFNetworkingOperationFailingURLResponseDataErrorKey) as! NSData, encoding: NSUTF8StringEncoding) 

        print(StrError) 
       } 
     } else if let errResponse: String = String(data: (error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as! NSData), encoding: NSUTF8StringEncoding) { 
       print(errResponse) 
     } 
    } 

} 

i kod Objective-C jest

NSDictionary *userinfo1 = [[NSDictionary alloc] initWithDictionary:error.userInfo]; 

if(userinfo1) { 
     NSError *innerError = [userinfo1 valueForKey:@"NSUnderlyingError"]; 
     if(innerError) { 
     NSDictionary *innerUserInfo = [[NSDictionary alloc] initWithDictionary:innerError.userInfo]; 
     if(innerUserInfo) 
     { 
       if([innerUserInfo objectForKey:AFNetworkingOperationFailingURLResponseDataErrorKey]) 
       { 
        NSString *strError = [[NSString alloc] initWithData:[innerUserInfo objectForKey:AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding]; 
          NSLog(@"Error is : %@",strError); 
       } 
     } 
     } else 
     { 
      NSString *errResponse = [[NSString alloc] initWithData:[userinfo1 valueForKey:@"AFNetworkingOperationFailingURLResponseDataErrorKey"] encoding:NSUTF8StringEncoding]; 

      if(errResponse) 
      { 
       NSLog(@"%@",errResponse); 
      } 
     } 
} 
2
- (void)requestWithURL:(NSString *)url parameterDictionary:(NSMutableDictionary *)data requestType:(NSString *)reqType handler:(NSObject *)handler selector:(SEL)selector 
{ 

    // reqType is POST or GET 
    // handler would be self if you define selector method in same class 
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

    NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:reqType URLString:[NSString stringWithFormat:@"%@",url] parameters:nil error:nil]; 

req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue]; 
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
if (data != nil) { 
    NSLog(@"Data is not nil"); 
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:0 error:&error]; 
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    [req setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; 

}else{ 
    NSLog(@"Data is nil"); 
} 

[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 

    if (!error) { 
//   NSLog(@"Reply JSON: %@", responseObject); 
     [handler performSelector:selector withObject:responseObject]; 
     if ([responseObject isKindOfClass:[NSDictionary class]]) { 
      //blah blah 
     } 
    } else { 
     NSLog(@"Error: %@, %@, %@", error, response, responseObject); 
     [handler performSelector:selector withObject:responseObject]; 
    } 
}] resume]; 
} 
0

Znalazłem rozwiązanie na GitHub:

@interface ResponseSerializer : AFJSONResponseSerializer 
@end 

@implementation ResponseSerializer 

- (id)responseObjectForResponse:(NSURLResponse *)response 
         data:(NSData *)data 
         error:(NSError *__autoreleasing *)errorPointer 
{ 
    id responseObject = [super responseObjectForResponse:response data:data error:errorPointer]; 
    if (*errorPointer) { 
     NSError *error = *errorPointer; 
     NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; 
     userInfo[@"responseObject"] = responseObject; 
     *errorPointer = [NSError errorWithDomain:error.domain code:error.code userInfo:[userInfo copy]]; 
    } 
    return responseObject; 
} 

@end 

a następnie przypisać go do swojego przełożonego:

self.manager.responseSerializer = [ResponseSerializer serializer]; 
0
let responseData:NSData = (error as NSError).userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as! NSData 
let s :String = String(data: responseData as Data, encoding: String.Encoding.utf8)! 

Dla Swift 3

0

Poprawiono niektóre kod tutaj, właściwie obsługi składniki ewentualne. Swift 3 (.1) ...

let nserror = error as NSError 
if let errordata = nserror.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as? Data { 
    if let errorResponse = String(data: errordata, encoding: String.Encoding.utf8) { 
     print("errorResponse: \(errorResponse)") 
    } 
}