2013-10-16 76 views
5

我需要連接到我的服務器才能獲得一些JSON數據,我必須同時支持iOS 6iOS 7NSURLSession或NSURLConnection - iOS 6支持

我應該創建兩個類?其中NSURLSessioniOS 7,NSURLConnectioniOS 6?或者我應該只爲他們兩個使用NSURLConnection

+0

檢查這個鏈接看NSURLSession上的一個很好的教程:http://www.raywenderlich.com/51127/nsurlsession-tutorial – whyoz

回答

3

將通過創建兩個單獨的類,基本上做同樣的事情得到什麼好處?如果你不能使用NSURLSession,因爲它僅在iOS 7中受支持,並且你可以使用NSURLConnection獲得相同的功能,NSURLConnection可以在兩者中使用,然後只需使用NSURLConnection。你將有更少的代碼來維護。

+0

這正是我的想法,但不應該總是使用最新的類?或者,我認識到自己是一件壞事? – yoeriboven

+1

那麼在使用酷酷的新API和支持較老的操作系統之間總是有一個權衡。新的API非常好,它可以幫助您避免在舊版本中執行額外的工作。但是,如果實施新的API意味着更多的工作(尤其是重複的工作),那麼我將不得不傳遞它。 – Brian

+0

似乎並不是這種情況......如果您需要持續進行會話,您似乎需要兩者,或者每次提出請求時都需要堅持一個新的會話,或者至少要通過憑證過程而不是堅持,取決於你需要連接多長時間。 – whyoz

0

如果您必須使用NSURLCredentialPersistenceForSession才能進入Windows身份驗證網絡,那麼使用NSURLConnection會爲您創建多個問題。我經歷的痛苦,現在和已經開始,我需要同時支持iOS的7。基本上,如果你使用NSURLConnectionwillSendRequestForAuthenticationChallenge結論,你會發現,在搭載iOS 7,您的會話將用一記結束的這自己的(似乎是30秒的思路)。所以,如果你必須堅持證書訪問更多的SOAP或其他,歡迎來到恐怖圓頂!如果我找到順利的解決方案,我會用代碼向你報告。

3

偉大的問題。事實上,我有同樣的問題,並研究了一下,我認爲這是一個使用協議(a.k.a.其他語言的接口)的好地方。這是基於從着名的「四人幫」模式書引用的「程序到接口,而不是實現」。我認爲最好是爲未來編寫代碼,所以如果他們決定貶低某些東西(這裏不是這種情況,但你永遠不知道),我永遠不會受到攻擊。

不是編寫類,而是編寫一個定義您想要使用的方法的協議,然後創建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 

將您的主應用程序編碼爲僅使用指向界面的指針,現在您可以切換類•不用改變你的主代碼:

// 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]]; 
} 

現在你可以改變服務器類,只要你想,從來沒有必須去追捕所有在你的代碼,你做出callService呼叫的地方:withData :.這是對接口進行編程的好處!

我使用了Rest vs Soap,因爲我覺得Objective-C更新的人可能會更好地理解,但在你的情況下,你可能會有一個ConnectionServer vs SessionServer或類似的東西。

上編程接口的另一個良好的讀/協議可以在這裏找到:https://stackoverflow.com/a/384067/504873

0

在寫作的時候,NSURLConnection的已被棄用,在OS X 10.11和iOS 9.0,但我的應用程序需要支持OS X 10.7和iOS 6. 因此,現在您必須爲正在進行的項目使用NSURLSession,但也支持現在已棄用的NSURLConnection類,以支持舊版OS!

我會這些天投票TenaciousJay解決方案與NSURLConnection類實現周圍的編譯器警告抑制。

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

你,你會通過創建兩個單獨的類,做中所獲得的利益基本上是相同的事情是,你最終可以切斷老,過時的解決方案,當你終於可以放棄對舊的操作系統版本的支持。

我使用一類或其他代碼的決定不會基於某些類的屬性,但對結果的宏,如:

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

針對iOS或OS X:

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); 
相關問題