

はじめまして。

Objective-C での同期通信処理で JSON ファイルのやりとりを行いたいのですが、 具体的にどの方法が良いのかわかりません。

`AFNetworking`を使わない方法が知りたいです。

Google で検索するも色々なやり方があり迷ってます。

ご教授、宜しくお願い致します。


CC BY-SA 3.0
2015-01-06T08:46:31.387
3180
2015-01-07T03:24:11.040
2015-01-06T09:57:45.107
4978
6108
question
ios objective-c json
Objective-C で JSON のやり取りをする 同期通信 をする方法


こんな感じじゃないですかね。

[code]

    NSURLRequest *urlRequest  = [NSURLRequest requestWithURL:
                         [NSURL URLWithString:@"http://www.physics.leidenuniv.nl/json/news.php"]];
    
    NSURLResponse * response = nil;
    NSError * error = nil;
    NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
    
    NSMutableData *responseData = [[NSMutableData alloc] init];
    [responseData appendData:data];
    
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSError *e = nil;
    NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error: &e];
    
[/code]


CC BY-SA 3.0
2015-01-06T10:08:09.267
3185
2015-01-06T10:08:09.267
6128
3180
answer


簡単なのはNSData#dataWithContentsOfURL:です。

[code]

    NSURL *url = [NSURL URLWithString:@"http://example.com"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    
[/code]

JSONのデコードは別途NSJSONSerialization等を使います。


CC BY-SA 3.0
2015-01-06T16:41:16.937
3215
2015-01-06T16:41:16.937
6060
3180
answer


幾つかあるので選び方だけ。

[code]

    [NSData dataWithContentsOfURL:url]
    
[/code]

はメインスレッドで実行すると、処理をブロックします。

[dataWithContentsOfURLのReference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/index.html#//apple_ref/occ/clm/NSData/dataWithContentsOfURL:)には

> Do not use this synchronous method to request network-based URLs. For
> network-based URLs, this method can block the current thread for tens of
> seconds on a slow network, resulting in a poor user experience, and in iOS,
> may cause your app to be terminated.

と書かれていて、ネットワークにあるデータを取得するために使うべきではありません。

[NSURLDownload](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLDownload_Class/)は、ファイルを直接ローカルに書き込む時に利用します。
[Geekなページ:NSURLDownload](http://www.geekpage.jp/programming/macosX-
network/NSURLDownload-1.php)あたりがわかりやすいです。

[NSURLSession](https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/)は、NSURLConnectionで必要だった面倒臭い実装をカプセル化してくれるクラスです。iOS7以降ではこちらを利用するべきです。
[NSURLSession
のまとめ](http://qiita.com/aKentaKoyama/items/96a979ab3a140e7b39ec)が参考になります。

[NSURLConnection](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/index.html)は、色々と細かく実装したい場合に利用できますが、基本的にはNSURLSessionで事足りると思います。

可能であれば、[AppleドキュメントのURL Loading System Programming
Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html#//apple_ref/doc/uid/10000165i)をお読みください。どんな時に何を選べばいいか、とても詳しく書かれています。


CC BY-SA 3.0
2015-01-07T03:24:11.040
3227
2015-01-07T03:24:11.040
351
3180
answer