2010-01-15 11 views
20

के साथ त्रुटि प्रबंधन, NSRLConnection sendSynchronousRequest के साथ मैं बेहतर त्रुटि प्रबंधन कैसे कर सकता हूं? मैं क्यों सिंक अनुरोध किया है वहाँ किसी भी तरह से मैंNSURLConnection sendSynchronousRequest

- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error 

लागू कर सकते हैं मैं एक nsoperation कतार जो पृष्ठभूमि में डेटा हो रही है है thats है। और यदि मुझे एसिंक अनुरोध लागू करना है तो मैं पूरा होने के अनुरोध के लिए कैसे प्रतीक्षा कर सकता हूं। क्योंकि वह विधि डेटा के बिना आगे नहीं बढ़ सकती है।

उत्तर

30

-sendSynchronousRequest: returningResponse: त्रुटि: आपको विधि में स्वयं त्रुटि प्राप्त करने का एक तरीका देता है। वह अंतिम तर्क वास्तव में (एनएसईआरआर **) त्रुटि है; वह है, एक एनएसईआरआर पॉइंटर के लिए एक सूचक। इसे आज़माएं:

NSError  *error = nil; 
NSURLResponse *response = nil; 

[NSURLConnection sendSynchronousRequest: req returningResponse: &response error: &error]; 

if (error) {...handle the error} 
+8

नहीं के बराबर करने के लिए त्रुटि और प्रतिक्रिया को प्रारंभ करना सुनिश्चित करें, मैं EXC_BAD_ACCESS त्रुटियों हो रही थी जब तक मैं इस सवाल का जवाब मिल गया। धन्यवाद +1! – keegan3d

+9

त्रुटि का परीक्षण करने से पहले आपको वास्तव में परिणाम की जांच करने की आवश्यकता है। प्रलेखन से * "अगर कोई कनेक्शन नहीं बनाया जा सकता है या डाउनलोड विफल हो जाता है तो" शून्य वापस आता है "* http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference .html # // apple_ref/occ/clm/NSURLConnection/sendSynchronousRequest: returningResponse: त्रुटि: – ohhorob

+5

कोको [गारंटी] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError ।एचटीएमएल # // apple_ref/doc/uid/TP40001806-CH204-SW1) कि यदि विधि विफल हो जाती है, तो त्रुटि ऑब्जेक्ट मान्य होगा; यह _ गारंटी नहीं देता है कि विधि सफल होने पर त्रुटि ऑब्जेक्ट 'nil' होगा। त्रुटि का उपयोग करने से पहले आपको प्रत्यक्ष वापसी मूल्य की जांच करनी होगी। –

55

मैं यह इंगित करने के लिए त्रुटि में भरोसा नहीं करता कि त्रुटि हुई है।

मैं बेन के उत्तर में वर्णित त्रुटि जांच का उपयोग कर रहा हूं, लेकिन मेरा मानना ​​है कि यह कुछ परिस्थितियों में झूठी सकारात्मक/नकली त्रुटियां उत्पन्न कर रहा है।

इस SO answer के अनुसार, मैं सफलता/विफलता निर्धारित करने के लिए विधि के परिणाम का उपयोग करने के लिए बदल रहा हूं। और फिर (और केवल तब) विफलता के विवरण के लिए त्रुटि सूचक की जांच करें।

NSError *requestError; 
NSURLResponse *urlResponse = nil; 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError]; 
/* Return Value 
    The downloaded data for the URL request. Returns nil if a connection could not be created or if the download fails. 
*/ 
if (response == nil) { 
    // Check for problems 
    if (requestError != nil) { 
     ... 
    } 
} 
else { 
    // Data was received.. continue processing 
} 

यह दृष्टिकोण डाउनलोडिंग प्रक्रिया में हुई त्रुटि के प्रति प्रतिक्रिया करने से बचने से बच जाएगा जो इसे विफल नहीं करता है। मुझे लगता है कि यह संभव है कि डाउनलोड होने के कारण यह गैर-महत्वपूर्ण त्रुटियों का सामना कर सके जो ढांचे के भीतर संभाले जाते हैं, और उनके पास त्रुटि सूचक के साथ त्रुटि सूचक को सेट करने का दुष्प्रभाव होता है।

उदाहरण के लिए, मुझे उन उपयोगकर्ताओं से मिली POSIX त्रुटियां मिल रही हैं, जिन्होंने यूआरएल कनेक्शन की प्रसंस्करण में गहराई से ऐसा ऐप डाउनलोड किया है।

इस कोड त्रुटि रिपोर्ट करने के लिए किया जाता है:

NSString *errorIdentifier = [NSString stringWithFormat:@"(%@)[%d]",requestError.domain,requestError.code]; 
[FlurryAPI logError:errorIdentifier message:[requestError localizedDescription] exception:nil]; 

और त्रुटि के रूप में रिपोर्ट प्रकट होता है:

Platform: iPhone 
Error ID: (NSPOSIXErrorDomain)[22] 
Msg: Operation could not be completed. Invalid argument 

मानचित्रण कि वापस ..

requestError.domain = NSPOSIXErrorDomain 
requestError.code = 22 
[requestError localizedDescription] = Operation could not be completed. Invalid argument 

सभी मैंने खोदने में सक्षम, यह है कि त्रुटि कोड 22 EINVAL है, लेकिन इससे कोई और विवरण नहीं मिला है।

अन्य त्रुटियों मैं NSURL डोमेन है, जो मैं पूरी तरह विविध नेटवर्क परिस्थितियों में उम्मीद से हैं:

NSURLErrorTimedOut 
NSURLErrorCannotConnectToHost 
NSURLErrorNetworkConnectionLost 
NSURLErrorNotConnectedToInternet 
+others 
+0

सफलता/विफलता निर्धारित करने के लिए परिणाम का उपयोग करना ऐसा करने का एकमात्र सही तरीका है और यह वास्तव में इस तरह से दस्तावेज किया गया है। आपके पहले दो अनुच्छेदों को प्रतिस्थापित किया जा सकता है "बेन का जवाब गलत है, यह करने का यह सही तरीका है।" :) – bbum