2013-10-16 11 views
5

JSONのデータを取得するにはサーバに接続する必要があり、iOS 6iOS 7の両方をサポートする必要があります。NSURLSessionまたはNSURLConnection - iOS 6のサポート

2つのクラスを作成する必要がありますか? 1つはの場合はNSURLSessioniOS 6の場合はNSURLConnectionの1つです。または、私はちょうど両方のためにNSURLConnectionを使用する必要がありますか?

+0

NSURLSessionに関する偉大なチュートリアルを見るには、このリンクをチェックしてください:http://www.raywenderlich.com/51127/nsurlsession-tutorial – whyoz

答えて

3

本質的に同じことを行う2つの別々のクラスを作成するとどんな利点がありますか? NSURLSessionがiOS 7でのみサポートされているため、NSURLSessionを使用できない場合は、両方で動作するNSURLConnectionを使用して同じ機能を使用できます。NSURLConnectionを使用してください。保守するコードが少なくなります。

+0

これはまさに私が思ったことですが、常に新しいクラスを使うべきではありませんか?それとも、私は自分自身を学んだ悪いことですか? – yoeriboven

+1

クールな新しいAPIの使用と古いOSのサポートの間には常にトレードオフがあります。新しいAPIは、古いバージョンでは余計な作業をしなくて済む場合に便利です。しかし、新しいAPIの実装がより多くの作業(特に重複した作業)を意味する場合は、それを渡す必要があります。 – Brian

+0

そうではないようです...セッションを維持する必要がある場合や、リクエストを行うたびに新しいセッションを維持する必要がある場合、または少なくとも資格認定プロセスを通過する必要がある場合は、両方が必要なようです接続が必要な期間によっては持続しないことがあります。 – whyoz

0

NSURLCredentialPersistenceForSessionをWindows認証ネットワークに導入する必要がある場合は、NSURLConnectionを使用すると複数の問題が発生します。私は今、痛みを経験しており、iOS 7をサポートするためには両方とも必要であるという結論に達しました。基本的には、NSURLConnectionwillSendRequestForAuthenticationChallengeを使用すると、iOS 7ではセッションが終了することに気づきます自分自身(30秒の心のスパンのように思える)。ですから、もしあなたがより多くのSOAPや何かにアクセスするために資格を保持しなければならないなら、テロ・ドームへようこそ!円滑な解決策が見つかったら、私はコードで報告します。

3

大きな質問です。実際、私は同じ質問をしてそれをかなり研究しました。これはプロトコル(他の言語ではa.k.a.インターフェイス)を使用するのに適していると思います。これは、有名な「Gang of Four」パターンブックの「実装ではなく、インターフェースへのプログラム」の引用に基づいています。私は、彼らが何かを非難することを決断すれば決して叩かれることはないので、未来を試みてコードすることが最善だと思います。

クラスを作成する代わりに、使用するメソッドを定義し、それらのメソッドを実装する2つの異なるクラスを作成するプロトコルを記述します。あなたのアプリケーションでは、そのプロトコルメソッドをすべて実装しているクラスを指すポインターを作成し、各実装クラスはそれを実現するフレームワーク/ライブラリ/その他のコードを使用できます。その後、

// Server.h 
@protocol Server <NSObject> 
@required 
- (void)callService:(NSString *)service withData:(NSData *)data; 
@end 

と、このようにRestServerクラスを作成します:例として、次のようなサーバプロトコル

を作成することができ

// RestServer.h 
#import "Server.h" 
@interface RestServer : NSObject <Server> 
@end 

// RestServer.m 
#import "RestServer.h" 
@implementation RestServer 
- (void)callService:(NSString *)service withData:(NSData *)data { 
// Code using REST 
} 
@end 

をし、その後のSoapServerのような別のクラスを作成:

// SoapServer.h 
#import "Server.h" 
@interface SoapServer : NSObject <Server> 
@end 

// SoapServer.m 
#import “SoapServer.h" 
@implementation SoapServer 
- (void)callService:(NSString *)service withData:(NSData *)data { 
// Code using SOAP 
} 
@end 

インターフェイスへのポインタを使用するだけであなたのメインアプリをコーディングすることができます。今度はクラスをスワップできます今、あなたはいつでも好きなときにサーバークラスを変更し、あなたがcallServiceへの呼び出しを行う、あなたのコード内のすべての場所を追い詰める行かなければならないことはありません

// SomeViewController.m 
#import “Server.h” 
#import “RestServer.h” 
#import “SoapServer.h” 
… 
- (void)someMethod() { 
    id<Server> myServer; 

    if ([self shouldIUseSoap]) 
     myServer = [[SoapServer alloc] init]; 
    else 
     myServer = [[RestServer alloc] init]; 

    [myServer callService:@"loginUser" withData:[self getData]]; 
} 

:ことなく、sがあなたのメインのコード変更するwithDataを:.これはインターフェイスへのプログラミングの利点です!

私はObjective-Cより新しい方が良いことを理解していると思ったので、Rest vs Soapを使用しましたが、あなたのケースではConnectionServerとSessionServerのようなものがあるでしょう。インターフェース/プロトコルへのプログラミング上の

もう一つの良い読み取りがここで見つけることができます:執筆時点でhttps://stackoverflow.com/a/384067/504873

0

、NSURLConnectionはOS X 10.11とiOS 9.0で廃止されましたが、私のアプリは、OS X 10.7とiOSをサポートする必要があります6. これで、現在進行中のプロジェクトではNSURLSessionを使用する必要がありますが、サポートされているレガシーOSリリースでは、現在廃止予定のNSURLConnectionクラスもサポートしています。

私は最近、NSURLConnectionクラス実装の周りにコンパイラの警告を抑制したTenaciousJayソリューションに投票しました。

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
     /* NSURLConnection code here */ 
#pragma GCC diagnostic pop 

あなたは本質的には同じことを行う二つの別々のクラスを作成することによって得るでしょう利点は、最終的には、レガシーOSのリリースのサポートをドロップすることができたときにあなたが最終的に古い、廃止予定のソリューションを遮断できるということです。

一つのクラスまたは他のを使用するために私のコードの決定は、いくつかのクラスの性質になく、その結果に基づいてされないマクロのように:OS X iOS用または用

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

NSString *systemVersion = nil; 
     if ([[NSProcessInfo processInfo] respondsToSelector:NSSelectorFromString(@"operatingSystemVersion")]) { 
      NSOperatingSystemVersion operatingSystemVersion = [[NSProcessInfo processInfo] operatingSystemVersion]; 
      systemVersion  = [NSString stringWithFormat:@"%ld.%ld.%ld", (long)operatingSystemVersion.majorVersion, (long)operatingSystemVersion.minorVersion, (long)operatingSystemVersion.patchVersion]; 
     } else { 
      SInt32 versionMajor=0, versionMinor=0, versionPatch=0; 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
      Gestalt(gestaltSystemVersionMajor, &versionMajor); 
      Gestalt(gestaltSystemVersionMinor, &versionMinor); 
      Gestalt(gestaltSystemVersionBugFix, &versionPatch); 
#pragma GCC diagnostic pop 
      systemVersion  = [NSString stringWithFormat:@"%ld.%ld.%ld", (long)versionMajor, (long)versionMinor, (long)versionPatch]; 
     } 
     NSLog(@"[Line %d] %s OS X Runtime Version: '%@'", __LINE__, __PRETTY_FUNCTION__, systemVersion); 
関連する問題