2017-12-18 6 views
1

私はこのコードを約12ヶ月間使用していましたが、このMacOSアプリケーションで初めてXcode 9を使用してビルドしています。このコードは、メインビューコントローラのinitから呼び出されたときに機能しますが、タイムアウトするたびに失敗します。ただし、サーバーは2回目以降の呼び出しを記録しません。私は最後の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を使用して認証ヘッダーを挿入します。もう1つの違いは、呼び出しが1回だけ呼び出されたときにプロトコルが呼び出しごとに複数回呼び出されていることです。

答えて

0

それはラインを交換するのと同じくらい簡単だった:

NSURLSession *session = [NSURLSession sharedSession]; 

と:

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; 
関連する問題