2014-06-27 8 views
5

मुझे NSURLSessionTask पर विधि जोड़ने की आवश्यकता है। यहाँ मेरी श्रेणी जो ऐसा करने के लिए माना जाता है है:NSURLSessionTask श्रेणी विधि "उदाहरण के लिए भेजे गए अपरिचित चयनकर्ता" के साथ क्रैश हो जाती है

// NSURLSessionTask+Extras.h 

#import <Foundation/Foundation.h> 

@interface NSURLSessionTask (Extras) 

- (void)helloNSURLSessionTask; 

@end 

// NSURLSessionTask+Extras.m 

#import "NSURLSessionTask+Extras.h" 

@implementation NSURLSessionTask (Extras) 

- (void)helloNSURLSessionTask { 
    NSLog(@"hello NSURLSessionTask!"); 
} 

@end 

सब कुछ अच्छी तरह संकलित, स्वत: पूर्ण काम करता है, लेकिन जब मैं इस विधि, मेरे अनुप्रयोग क्रैश फोन:

2014-06-27 12:32:23.916 Test[4333:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFLocalDataTask helloNSURLSessionTask]: unrecognized selector sent to instance 0x109723310' 

एक ही दृष्टिकोण अगर मैं करने के लिए श्रेणी जोड़ने के काम करता है NSObject, और मुझे समझ में नहीं आ रहा है कि यह NSURLSessionTask के लिए क्यों नहीं है। https://dl.dropboxusercontent.com/u/25100182/Test.zip

उत्तर

4

दुर्भाग्य से ऐसा प्रतीत नहीं होता कि NSURLSession श्रेणियों का समर्थन कर सकते हैं:

यहाँ एक परीक्षण परियोजना जो मेरे लिए इस समस्या reproduces है। मैंने एक समस्या में भाग लिया है जैसे कि एक संबद्ध वस्तु जोड़ने की कोशिश कर रहा है।
here भी देखें।

+0

पॉइंटर के लिए धन्यवाद, मैं आपके सुझावों का प्रयास करूंगा। वैसे, क्या आपको लगता है कि दस्तावेज़ में कहीं भी इस समस्या का उल्लेख किया गया है? –

+0

नहीं, मुझे अभी भी समझ में नहीं आया कि यह एक बग है या "फीचर" है – Andrea

4

मुझे NSURLSessionDataTask श्रेणी में समान समस्या थी, जब मैंने एनएसआरएल सत्र टास्क में दायरा घटाया, तो यह सही तरीके से काम कर रहा है।

@interface NSURLSessionTask (iRemoteWallet) 
    @property (nonatomic, weak) id context; 
@end 

उम्मीद है कि इससे मदद मिलती है।

1

मुझे विश्वास है कि मुझे पता है कि यह अजीब (कम से कम मेरे लिए) व्यवहार की उत्पत्ति क्या है। मैं एक उदाहरण प्रदान करूंगा कि आईओएस 9.2 में मुझे NSURLSessionDataTask के साथ सामना करना पड़ा है।

जब आप विधि है कि आप एक वर्ग -myMethod में जोड़ दिया है इस्तेमाल करने की कोशिश:

[__NSCFLocalDataTask -myMethod]: गैर मान्यता प्राप्त चयनकर्ता भेजा उदाहरण

को आप इस तरह एक अपवाद देखेंगे

मैं खुदाई शुरू की और पाया कि __NSCFLocalDataTask वर्ग जो रनटाइम के दौरान हमारे NSURLSessionDataTask वर्ग के पीछे छुपाता सिर्फ NSURLSessio लिए casted है गया है nDataTask लेकिन इससे प्राप्त नहीं होता है। __NSCFLocalSessionTask: __NSCFURLSessionTask: NSObject इस वर्ग विरासत श्रृंखला __NSCFLocalDataTask है। तो मेरी श्रेणी इस वर्ग पर बिल्कुल लागू नहीं होती है। कोई आश्चर्य नहीं कि यह अपरिचित है।

इसका एक समाधान आपकी श्रेणी को एनएसओब्जेक्ट में स्थानांतरित करने और जांच का एक गुच्छा बनाने के लिए हो सकता है। मैंने इसे इस तरह किया:

if ([self respondsToSelector:@selector(response)]) { 
    id response = [self performSelector:@selector(response)]; 

    if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 

     return [NSString stringWithFormat:@"%td", ((NSHTTPURLResponse *)response).statusCode]; 

    } 

} 

NSException *e =[NSException exceptionWithName:NSInternalInconsistencyException reason:@"errorCode: method should be only used on classes that implement -(NSHTTPURLResponse *)response: method." userInfo:nil]; 

@throw e; 

बदसूरत? हाँ! लेकिन यह अभी के लिए काम करता है।

संबंधित मुद्दे