2013-10-16 7 views
5

मुझे कुछ JSON डेटा प्राप्त करने के लिए मेरे सर्वर से कनेक्शन बनाने की आवश्यकता है और मुझे iOS 6 और iOS 7 दोनों का समर्थन करना होगा।NSURLSession या NSURLConnection - आईओएस 6 समर्थन

क्या मुझे दो कक्षाएं बनाना चाहिए? iOS 7 के लिए NSURLSession और iOS 6 के लिए NSURLConnection के साथ एक? या मुझे उन दोनों के लिए NSURLConnection का उपयोग करना चाहिए?

+0

NSURL सत्र पर एक महान ट्यूटोरियल देखने के लिए इस लिंक को देखें: http://www.raywenderlich.com/51127/nsurlsession-tutorial – whyoz

उत्तर

3

दो अलग-अलग वर्गों को बनाकर आपको क्या लाभ मिलेगा जो अनिवार्य रूप से वही काम करते हैं? यदि आप NSURLSession का उपयोग नहीं कर सकते हैं क्योंकि यह केवल आईओएस 7 में समर्थित है, और आप NSURLConnection का उपयोग करके समान कार्यक्षमता प्राप्त कर सकते हैं, जो दोनों में काम करता है, फिर केवल NSURLConnection का उपयोग करें। आपके पास बनाए रखने के लिए कम कोड होगा।

+0

यह वही है जो मैंने सोचा था, लेकिन क्या आप हमेशा नवीनतम कक्षाओं का उपयोग नहीं करना चाहिए? या क्या वह एक बुरी चीज है जिसे मैंने खुद सीखा? – yoeriboven

+1

अच्छी तरह से शांत नए एपीआई और पुराने ओएस का समर्थन करने के बीच हमेशा एक व्यापार बंद है। नए एपीआई बहुत अच्छे होते हैं जब वे आपको अतिरिक्त काम करने से बचाते हैं जो आपको पुराने संस्करण में करना पड़ता था। लेकिन अगर नए एपीआई को लागू करना अधिक काम करता है (विशेष रूप से डुप्लिकेटेड काम), तो मुझे इसे पास करना होगा। – Brian

+0

जो ऐसा प्रतीत नहीं होता है ... ऐसा लगता है कि आपको सत्रों को जारी रखने की आवश्यकता है या आपको हर बार एक नया सत्र जारी रखने की आवश्यकता होगी, या कम से कम क्रेडेंशियल प्रक्रिया से गुज़रना होगा और इस बात पर निर्भर नहीं रहें कि आपको कनेक्शन की कितनी देर की आवश्यकता है। – whyoz

0

यदि आपको Windows प्रमाणीकरण नेटवर्क में जाना है तो NSURLCredentialPersistenceForSession का उपयोग करना होगा ... तो NSURLConnection का उपयोग करके आपके लिए कई समस्याएं पैदा होंगी। मैं अभी दर्द से गुजर रहा हूं और इस निष्कर्ष पर आया हूं कि मुझे आईओएस 7 का समर्थन करने के लिए दोनों की आवश्यकता है। असल में, यदि आप NSURLConnection और willSendRequestForAuthenticationChallenge का उपयोग करते हैं, तो आप पाएंगे कि आईओएस 7 में, आपका सत्र इसके दिमाग से खत्म हो जाएगा स्वयं (30 सेकंड दिमाग की तरह लगता है)। तो अगर आपको अधिक एसओएपी या जो कुछ भी पहुंचने के लिए एक प्रमाण पत्र जारी रखना है, तो आतंकवादी गुंबद में आपका स्वागत है! यदि मुझे एक चिकनी समाधान मिल जाए तो मैं कोड के साथ आपको वापस रिपोर्ट करूंगा।

3

शानदार सवाल। असल में मेरे पास एक ही सवाल था और मैंने थोड़ा सा शोध किया और मुझे लगता है कि प्रोटोकॉल (अन्य भाषाओं में ए.के.ए. इंटरफेस) का उपयोग करने के लिए यह एक अच्छी जगह है। यह प्रसिद्ध "गैंग ऑफ फोर" पैटर्न बुक से उद्धरण के आधार पर "एक इंटरफ़ेस पर प्रोग्राम, कार्यान्वयन नहीं है" से बाहर है। मुझे लगता है कि भविष्य के लिए कोशिश करना और कोड करना सबसे अच्छा है, इसलिए अगर मैं कुछ तोड़ने का फैसला करता हूं (जो यहां मामला नहीं है, लेकिन आप कभी नहीं जानते) तो मुझे कभी भी दिक्कत नहीं होती है।

कक्षाएं लिखने के बजाय, एक प्रोटोकॉल लिखें जो उन विधियों को परिभाषित करता है जिन्हें आप उपयोग करना चाहते हैं और फिर उन विधियों को लागू करने वाले 2 अलग-अलग वर्ग बनाएं। अपने ऐप में आप एक पॉइंटर बना सकते हैं जो कि किसी भी वर्ग को इंगित कर सकता है जो कि सभी प्रोटोकॉल विधियों को लागू करता है और फिर प्रत्येक कार्यान्वयन वर्ग जो भी ढांचे/पुस्तकालय/अन्य कोड का उपयोग कर सकता है, वे ऐसा करना चाहते हैं। SoapServer की तरह अन्य वर्ग

// 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 

और फिर बनाने के लिए::

उदाहरण के लिए, अगर आप इस तरह एक सर्वर प्रोटोकॉल बना सकते हैं:

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

और उसके बाद इस तरह की एक RestServer वर्ग बनाने

// 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 :. यह इंटरफेस के लिए प्रोग्रामिंग का लाभ है!

मैंने आराम बनाम साबुन का उपयोग किया क्योंकि मैंने लोगों को उद्देश्य के लिए नया लगाया-सी बेहतर समझ सकता है, लेकिन आपके मामले में आपके पास एक कनेक्शन सर्वर बनाम सत्र सर्वर या ऐसा कुछ हो सकता है।

इंटरफेस के प्रोग्रामिंग पर एक और अच्छा पढ़ने/प्रोटोकॉल यहां पाया जा सकता: https://stackoverflow.com/a/384067/504873

0

लेखन के समय, NSURLConnection ओएस एक्स 10.11 और iOS 9.0 में पदावनत किया गया है, लेकिन मेरी Apps का समर्थन करने के लिए OS X 10.7 और IOS की जरूरत 6. तो अब आपको चल रही परियोजनाओं के लिए NSURLSession का उपयोग करना है लेकिन समर्थित विरासत ओएस रिलीज़ के लिए अब हटाए गए 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 के लिए या के लिए ओएस एक्स

:

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); 
संबंधित मुद्दे