2017-12-18 1 views
1

나는이 코드를 약 12 ​​개월 동안 사용해 왔지만, 오늘은 MacOS 애플리케이션으로 처음으로 Xcode 9를 사용하여 무관 한 변경을 시도했습니다. 이 코드는 주 뷰 컨트롤러 init 내에서 호출되면 작동하지만 타임 아웃을 할 때마다 실패합니다. 그러나 서버는 두 번째 및 후속 호출을 기록하지 않습니다. 나는 마지막 Xcode 8 빌드가 여전히 작동하고 있다는 것을 확인했다. 그래서 스레딩에 대한 약간의 변화라고 생각한다.macOS 10.12의 NSURLSession 스레드 변경 사항?

+ (void) postRequest:(NSString *)url withContentType:(NSString *)contentType body:(NSData *)body onCompletion:(void (^)(BOOL success, NSDictionary *json, NSError *error))onCompletion 
{ 
    NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    postRequest.HTTPMethod = @"POST"; 
    [postRequest addValue:contentType forHTTPHeaderField: @"Content-Type"]; 
    postRequest.HTTPBody = body; 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:postRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     NSDictionary *json = (data != nil) ? [NSJSONSerialization JSONObjectWithData:data options:0 error:nil] : [NSDictionary dictionary]; 
     BOOL success = !error && ![[json valueForKey:ERROR] integerValue]; 
     onCompletion(success, json, error); 
    }]; 
    [dataTask resume]; 
} 

나는 작업이 의도적으로 배경 스레드에 배치됩니다 생각하지만, 나는이 앞으로 취할 방법에 대한 손실에입니다. 주 스레드에서 다른 지점에 놓는 것은 효과가 없습니다.

관련이 있는지 모르겠지만 사용자 지정 NSURLProtocol을 사용하여 권한 헤더를 삽입하고 또 다른 차이점은 단 한 번 호출되었을 때 프로토콜이 각 호출마다 여러 번 호출된다는 것입니다.

NSURLSession *session = [NSURLSession sharedSession]; 

와 :

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; 

답변

0

그것은 광고를 대체 한 단순