From 6a6862c43b735f3b9d12a273d7774c5a68bf7532 Mon Sep 17 00:00:00 2001 From: Oliver Letterer Date: Sun, 21 Apr 2013 18:07:46 +0200 Subject: [PATCH 1/3] Workaround for #907. --- AFNetworking/AFHTTPClient.m | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/AFNetworking/AFHTTPClient.m b/AFNetworking/AFHTTPClient.m index e23f2a0..683326f 100644 --- a/AFNetworking/AFHTTPClient.m +++ b/AFNetworking/AFHTTPClient.m @@ -1114,8 +1114,21 @@ static const NSUInteger AFMultipartBodyStreamProviderDefaultBufferLength = 4096; } - (void)close { - [_outputStream close]; - _outputStream.delegate = nil; + NSOutputStream *outputStream = self.outputStream; + + [outputStream close]; + outputStream.delegate = nil; + + /* + Workaround for a race condition in CFStream _CFStreamCopyRunLoopsAndModes. This outputstream needs to be retained just a little longer. + + See: https://github.com/AFNetworking/AFNetworking/issues/907 + */ + double delayInSeconds = 2.0; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^{ + outputStream.delegate = nil; + }); _self = nil; } From 05184b2769c0783d2a3308b871c4b657dee54952 Mon Sep 17 00:00:00 2001 From: Audun Holm Ellertsen Date: Mon, 29 Apr 2013 12:19:45 +0100 Subject: [PATCH 2/3] Adds explicit type casts where necessary for ObjC++ compilation --- AFNetworking/AFHTTPClient.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AFNetworking/AFHTTPClient.m b/AFNetworking/AFHTTPClient.m index e23f2a0..babe4bc 100644 --- a/AFNetworking/AFHTTPClient.m +++ b/AFNetworking/AFHTTPClient.m @@ -693,7 +693,7 @@ static void AFNetworkReachabilityReleaseCallback(const void *info) { } self.stringEncoding = [aDecoder decodeIntegerForKey:@"stringEncoding"]; - self.parameterEncoding = [aDecoder decodeIntegerForKey:@"parameterEncoding"]; + self.parameterEncoding = (AFHTTPClientParameterEncoding) [aDecoder decodeIntegerForKey:@"parameterEncoding"]; self.registeredHTTPOperationClassNames = [aDecoder decodeObjectForKey:@"registeredHTTPOperationClassNames"]; self.defaultHeaders = [aDecoder decodeObjectForKey:@"defaultHeaders"]; @@ -1072,7 +1072,7 @@ static const NSUInteger AFMultipartBodyStreamProviderDefaultBufferLength = 4096; - (void)handleOutputStreamSpaceAvailable { while ([_outputStream hasSpaceAvailable]) { if ([_buffer length] > 0) { - NSInteger numberOfBytesWritten = [_outputStream write:[_buffer bytes] maxLength:[_buffer length]]; + NSInteger numberOfBytesWritten = [_outputStream write:(uint8_t const *)[_buffer bytes] maxLength:[_buffer length]]; if (numberOfBytesWritten < 0) { [self close]; return; @@ -1094,7 +1094,7 @@ static const NSUInteger AFMultipartBodyStreamProviderDefaultBufferLength = 4096; [_buffer setLength:self.bufferLength]; - NSInteger numberOfBytesRead = [self.currentHTTPBodyPart read:[_buffer mutableBytes] maxLength:[_buffer length]]; + NSInteger numberOfBytesRead = [self.currentHTTPBodyPart read:(uint8_t *)[_buffer mutableBytes] maxLength:[_buffer length]]; if (numberOfBytesRead < 0) { [self close]; return; From 1ce0a211babf42b84e0ef28b3fa6b4e9f3f1382c Mon Sep 17 00:00:00 2001 From: Oliver Letterer Date: Thu, 2 May 2013 20:03:17 +0200 Subject: [PATCH 3/3] Using self.error instead of self.JSONError in AFJSONRequestOperation. --- AFNetworking/AFJSONRequestOperation.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AFNetworking/AFJSONRequestOperation.m b/AFNetworking/AFJSONRequestOperation.m index ac7423a..6db5f70 100644 --- a/AFNetworking/AFJSONRequestOperation.m +++ b/AFNetworking/AFJSONRequestOperation.m @@ -120,7 +120,7 @@ static dispatch_queue_t json_request_operation_processing_queue() { dispatch_async(json_request_operation_processing_queue(), ^{ id JSON = self.responseJSON; - if (self.JSONError) { + if (self.error) { if (failure) { dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ failure(self, self.error);