我需要連接到我的服務器才能獲得一些JSON
數據,我必須同時支持iOS 6
和iOS 7
。NSURLSession或NSURLConnection - iOS 6支持
我應該創建兩個類?其中NSURLSession
爲iOS 7
,NSURLConnection
爲iOS 6
?或者我應該只爲他們兩個使用NSURLConnection
?
我需要連接到我的服務器才能獲得一些JSON
數據,我必須同時支持iOS 6
和iOS 7
。NSURLSession或NSURLConnection - iOS 6支持
我應該創建兩個類?其中NSURLSession
爲iOS 7
,NSURLConnection
爲iOS 6
?或者我應該只爲他們兩個使用NSURLConnection
?
將通過創建兩個單獨的類,基本上做同樣的事情得到什麼好處?如果你不能使用NSURLSession,因爲它僅在iOS 7中受支持,並且你可以使用NSURLConnection獲得相同的功能,NSURLConnection可以在兩者中使用,然後只需使用NSURLConnection。你將有更少的代碼來維護。
這正是我的想法,但不應該總是使用最新的類?或者,我認識到自己是一件壞事? – yoeriboven
那麼在使用酷酷的新API和支持較老的操作系統之間總是有一個權衡。新的API非常好,它可以幫助您避免在舊版本中執行額外的工作。但是,如果實施新的API意味着更多的工作(尤其是重複的工作),那麼我將不得不傳遞它。 – Brian
似乎並不是這種情況......如果您需要持續進行會話,您似乎需要兩者,或者每次提出請求時都需要堅持一個新的會話,或者至少要通過憑證過程而不是堅持,取決於你需要連接多長時間。 – whyoz
如果您必須使用NSURLCredentialPersistenceForSession
才能進入Windows身份驗證網絡,那麼使用NSURLConnection
會爲您創建多個問題。我經歷的痛苦,現在和已經開始,我需要同時支持iOS的7。基本上,如果你使用NSURLConnection
和willSendRequestForAuthenticationChallenge
結論,你會發現,在搭載iOS 7,您的會話將用一記結束的這自己的(似乎是30秒的思路)。所以,如果你必須堅持證書訪問更多的SOAP或其他,歡迎來到恐怖圓頂!如果我找到順利的解決方案,我會用代碼向你報告。
偉大的問題。事實上,我有同樣的問題,並研究了一下,我認爲這是一個使用協議(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
在寫作的時候,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);
檢查這個鏈接看NSURLSession上的一個很好的教程:http://www.raywenderlich.com/51127/nsurlsession-tutorial – whyoz