2016-10-10 5 views
-1

サーバーから切断応答は:NSURLSession(iOSの10)私は私にJSON文字列を送信し、サーバーへのHTTPリクエストを行うには、このコードを書いている

-(NSDictionary*)doRequestWithCommand:(NSString*)command andBody:(NSString*)requestBody { 
    __block NSDictionary *result = nil; 
    NSURL *URL = [NSURL URLWithString: [NSString stringWithFormat:@"%@%@", PREFIX_URL, command] ]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:60.0]; 
    [request setHTTPMethod:REQUEST_TYPE_POST]; 
    [request setHTTPBody:[requestBody dataUsingEncoding:NSUTF8StringEncoding]]; 
    dispatch_semaphore_t sem = dispatch_semaphore_create(0); 
    __block BOOL done = NO; 
    while (!done) { 
     NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
      if (data != nil) { 
       result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
       NSLog(@"%@", [[NSString alloc] initWithData:data encoding:4]); 
       NSLog(@"len %lu", [[[NSString alloc] initWithData:data encoding:4] length]); 
       done = YES; 
      } 
      dispatch_semaphore_signal(sem); 
     }]; 
     [dataTask resume]; 
     dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 
    } 
    return result; 
} 

このコードは、iOS 9と下で正常に動作しますしかし、iOS 10はありません!実際にはサーバーからの答えは1610番目の文字がカットされています!

私は何が問題なのか分かりません! 私を助けることができますか?

おかげ

+0

'dataTaskWithRequest'によって返されたエラーオブジェクトを調べる必要があります。それは「なし」ですか?また、 'JSONObjectWithData'によって返されたエラーオブジェクトを取得し、それが' nil'かどうかを確認する必要があります。コードがうまくいかないときは、最初に行うべきことは、エラーオブジェクトを調べ始めることです。 – Rob

+0

'result'リファレンスは' nil'ですか? 'nil'の場合は、サーバーからのJSONレスポンスに問題があると思われます。あなたはこのJSONを手動で構築していますか、それを構築するためにAPIを使用していますか?また、問題がある場合、 'JSONObjectWithData'によって返されたエラーオブジェクトは、何かがJSONに何か問題があるかどうかを教えてくれます。 – Rob

+0

エラーはゼロです!そして答え(結果)は無しではなく、iOSから削除されます。答えはサーバーから生成され、完全かつ正確です!私が残りのクライアントからのリクエストをしようとすると、答えは正しいものの、カットされないので、問題はIOSですが、私は何か分かりません! – frank

答えて

1

dispatch_semaphore_tのこの全体の使用が間違っている、とあなたは決して最初の場所でそれをやってされていないはずです。 dataが届いた後に何かする必要がある場合は、dataが設定された行の直後に完了ハンドラを実行します。愚かなセマフォーゲームをしないでください完了ハンドラの後にしてください。 できませんは、そのネットワークからのデータに基づいて、非同期ネットワークを使用するメソッドから結果を返します。 できません。

+3

セマフォを使用すべきではないが、質問には答えられないということは間違いありません。セマフォーは、彼が記述する振る舞いを説明しません。 – Rob

+0

@Rob私はそれを知らない。セマフォがロックされていない可能性があり、そのためデータが縮小されています。 – matt

+0

TbhこれはおそらくコメントでなければなりませんMatt;)低品質の投稿にフラグが立てられました。私はここでそれを残しておきますが、うまくいけばそれをコメントに移行することができます。 – brandonscript

関連する問題