2011-11-02 13 views
6

मैं सर्वर से डेटा प्राप्त करने के लिए sendSynchronousRequest का उपयोग कर रहा हूं। मुझे पता है कि सिंक्रोनस उस अनुरोध के लिए प्राप्त डेटा तक इंतजार करेगा।NSURLConnection sendSynchronousRequest - अग्रभूमि के लिए पृष्ठभूमि

लेकिन समस्या तब आती है जब गलती से उपयोगकर्ता कुछ गैर-मौजूदा यूआरएल में प्रवेश करता है और प्रतिक्रिया प्राप्त करने की कोशिश करता है। इस मामले में, यदि उपयोगकर्ता पृष्ठभूमि में जाता है और अग्रभूमि में आता है तो यह केवल ब्लैक स्क्रीन दिखाता है। यह केवल स्टेटस बार दिखाता है। इसके अलावा यह कोई पृष्ठभूमि अनुप्रयोग नहीं दिखा रहा है। मुझे अपने आवेदन से बाहर आने के लिए होम बटन दबा देना है।

सिम्युलेटर पर, 1+ मिनट के बाद यह मुझे संदेश देता है कि "अनुरोध समय समाप्त करें" (कोई क्रैश नहीं)।

डिवाइस पर, 1 मिनट के भीतर एप्लिकेशन क्रैश हो जाता है।

कोई सुझाव। कोई मदद। यह वास्तव में मेरे ऐप में एक गंभीर मुद्दा है।

धन्यवाद।

+0

आप दुर्घटनाग्रस्त होने से पहले कंसोल में कुछ हो रही है। – iamsult

+0

कृपया कुछ क्रैश लॉग पोस्ट करें। – HelmiB

उत्तर

14

जूलियन ने कहा जैसे, वॉचडॉग आपके ऐप को मार रहा है।कुछ सवालों के जवाब देने के लिए:

  • यह सिम्युलेटर पर क्यों होता है? क्योंकि जब आप वॉचडॉग डिबग कर रहे हों तो अपने ऐप को अकेले छोड़ दें, इसमें समय लग सकता है।
  • ऐसा क्यों होता है जब उपयोगकर्ता गलत यूआरएल में प्रवेश करता है? सिस्टम टाइमआउट के कारण, सिस्टम 60 सेकंड के लिए प्रयास जारी रखेगा यदि यह सर्वर नहीं ढूंढ पाता है।
  • तो समस्या सिंक्रोनस बनाम एसिंक्रोनस है? नहीं, समस्या धागा है, आप पृष्ठभूमि थ्रेड में एक ही ऑपरेशन कर सकते हैं, बस इसे मुख्य थ्रेड पर न करें और वॉचडॉग आपको अकेला छोड़ देगा।
  • ऐप आने पर स्क्रीन काली क्यों है? याद रखें, आप मुख्य धागे पर अवरुद्ध सामान बना रहे हैं, जो धागा खींचता है ...

आशा है कि सब कुछ था। अगर मुझे कुछ याद आया तो मुझे बताएं।

0

NSURLConnection के बजाय ASIHttpRequest क्लास का उपयोग करें, इसके अलावा NSRLConnection के चारों ओर रैपर नहीं है और इसमें बहुत ही सरल कॉलबैक हैं, आप अनुरोध को पूरा करने के लिए समय भी निर्धारित कर सकते हैं। कृपया मुझे लगता है कि क्योंकि आप किसी भी डेटा है जब उपयोगकर्ता में प्रवेश करती है गलत URL नहीं मिलता आवेदन दुर्घटनाग्रस्त और आप इस का उपयोग कर रहे और अधिक जानकारी http://allseeing-i.com/ASIHTTPRequest/

+0

NSURLConnection मेरे लिए ठीक से काम कर रहा है, केवल उपरोक्त मामले में इसके क्रैश होने पर। – JiteshW

+0

ASIHttpRequest NSURLConnection का बिल्कुल उपयोग नहीं करता है। इसके अलावा ASIHttpRequest सक्रिय विकास के तहत नहीं है। – hooleyhoop

-1

के लिए इस लिंक के माध्यम से जाना 'लौट आए' nilNSData सामान करना है।

मैं इससे आपकी समस्या ठीक हो जाएगा लगता है

NSData *data=[NSURLConnection sendSynchronousRequest:request 
            returningResponse:&response 
               error:&error]; 
if(data!=nil){ 
    /// 
} else { 
    NSLog(@"NO DATA"); 
} 
0

मुझे लगता है कि आप पहली बार है कि क्या यह सही है या नहीं और केवल यदि यह सही है की तुलना में, अनुरोध अन्यथा शीघ्र उपयोगकर्ता भेजता है "कृपया उपयोगकर्ता डेटा का परीक्षण करने के लिए है सही डेटा दर्ज "...

या

जब जवाब में डेटा के अपने पार्स विफल रहा है। आप प्रोटोकॉल प्रतिनिधि विधि भी बना सकते हैं i.e FinishWithError ताकि आप अपने अंतिम यूआई के साथ आ सकें।

0

इस एक का प्रयास करें:

#import "ASIHTTPRequest.h" 

//In a method 
[self performSelectorInBackground:@selector(DownLoadImageInBackground:) withObject:imgUrlArr]; 


-(void) DownLoadImageInBackground:(NSArray *)imgUrlArr1 
{ 
    NSURL * url = [Image URL]; 

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 
} 

-(void)requestFailed:(ASIHTTPRequest *)request 

{ 

    NSLog(@"URL Fail : %@",request.url); 

    NSError *error = [request error]; 

     // you can give here alert too.. 
} 

-(void)requestFinished:(ASIHTTPRequest *)request 

{ 

    NSData *responseData = [request responseData]; 
    UIImage *imgInBackground = [[UIImage alloc] 
         initWithData:responseData]; 
    [imageView setImage: imgInBackground]; 

} 

यह आपकी मदद कर सकते हैं: मैं भी एक समय में छवियों के एक नंबर लोड हो रहा हूँ, इसलिए छवियों कोई उचित डेटा है कि एक काली स्क्रीन दिखाई देते हैं। इससे बचने के लिए, अपनी छविदृश्य का आकार बदलने का प्रयास करें।

0

आप अनुरोध शुरू करने से पहले यूआरएल की पहुंच क्षमता की जांच कर सकते हैं। ऐप्पल में Reachability ऐसा करने के तरीके हैं। लेकिन एक रैपर का उपयोग करना आसान है। जैसे ASIReachability

3

आप इस लेख के लिए एक नज़र डालनी चाहिए: https://developer.apple.com/library/ios/#qa/qa1693/_index.html

IOS, एक प्रहरी शामिल करता है, तो आपके आवेदन मुख्य थ्रेड पर एक ऑपरेशन पर ज्यादा समय के लिए अवरुद्ध है, यह एक की हत्या कर दी जाएगी। (वॉचडॉग के बारे में अधिक जानकारी के लिए: http://en.wikipedia.org/wiki/Watchdog_timer)

तो यदि आप कुछ डाउनलोड करना चाहते हैं, तो इसे मुख्य थ्रेड पर डाउनलोड न करें।

+0

मुझे यकीन नहीं है, लेकिन वह डाउनलोड का जिक्र नहीं करता है। मुख्य धागे पर सिंक्रोनस कनेक्शन शायद लॉगिन के लिए समझ सकता है – suprandr

+1

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

8

क्यों नहीं अपने कनेक्शन के लिए टाइमआउट सेट करना?

NSString *urlString = TEST_CONNECTION; 
NSError *error = nil; 
NSHTTPURLResponse *response = nil; 
NSURLRequest *request = [NSURLRequest 
         requestWithURL:[NSURL URLWithString:urlString] 
         cachePolicy:NSURLRequestReloadIgnoringCacheData 
         timeoutInterval:5.0]; 


NSData *conn = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

यह सेकंड के एक नंबर है, जो एक अतुल्यकालिक कॉल के साथ जा रहा बिना

आपकी समस्या का समाधान करना चाहिए (जो कभी कभी उचित समाधान नहीं है) के बाद तुल्यकालिक प्रतीक्षा जारी करना चाहिए मैं जानता हूँ कि यह ठीक से काम करता है क्योंकि इस तरह मैं जांचता हूं कि क्या मैं एक निश्चित वीपीएन से जुड़ा हूं (जहां पहुंचने योग्य झंडे पूरी तरह विफल हो जाते हैं)।

2

संबंधित हैं

UIImage *image = [self.imgCache objectForKey:urlString]; 
if(!image){ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0]; 


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSURLResponse *response = nil; 
     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; 
     NSLog(@"%@",response); 
     UIImage *img = [UIImage imageWithData:data]; 
     // 

     if(img) 
     { 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       [self.imgCache setObject:img forKey:urlString]; 
       completionBlock(img); 
      }); 
     } 
    }); 

} 
else{ 
    completionBlock(image); 
} 
संबंधित मुद्दे