2013-04-30 12 views
6

से फ़ाइलों को डाउनलोड नहीं कर रहा है मेरे पास एक टेबलव्यू सेल सबक्लास में NSURLConnection है जो अधिकांश फ़ाइलों को डाउनलोड कर सकता है। मैंने देखा, हालांकि, कुछ डाउनलोड करना शुरू करने में विफल रहता है, और समय समाप्त हो जाता है। एक उदाहरण this यूआरएल होगा, जो सिर्फ एक परीक्षण ज़िप फ़ाइल है जो किसी अन्य ब्राउज़र में ठीक डाउनलोड करता है। डाउनलोड के लिए मेरा कोड हैआईओएस NSURLConnection कुछ यूआरएल

-(void)downloadFileAtURL:(NSURL *)url{ 
    self.downloadedData = [[NSMutableData alloc] init]; 
    self.url = url; 
    conn = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:self.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1200.0] delegate:self startImmediately:YES]; 
} 

- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSHTTPURLResponse*)response 
{ 
    int statusCode = [response statusCode]; 
    if (statusCode == 200){ 
     self.fileName.text = response.URL.lastPathComponent; 
     self.respo = response; 
     expectedLength = [response expectedContentLength]; 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [self.downloadedData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    CFStringRef mimeType = (__bridge CFStringRef)[_respo MIMEType]; 
    CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL); 
    CFStringRef extension = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassFilenameExtension); 
    NSString *fileName = [NSString stringWithFormat:@"%@.%@", [[_respo suggestedFilename] stringByDeletingPathExtension], (__bridge NSString *)extension]; 
    [[NSFileManager defaultManager] createFileAtPath:[[self docsDir] stringByAppendingPathComponent:[NSString stringWithFormat:@"Downloads/%@", fileName]] contents:_downloadedData attributes:nil]; 
} 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    NSLog(@"Download failed with error: %@", error); 
} 

कोई भी ऐसा कुछ देख सकता है जो इसका कारण हो सकता है?

यहाँ त्रुटि:

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x1fd2c650 
{NSErrorFailingURLStringKey=http://download.thinkbroadband.com/10MB.zip, 
NSErrorFailingURLKey=http://download.thinkbroadband.com/10MB.zip, 
NSLocalizedDescription=The request timed out., NSUnderlyingError=0x1fdc90b0 "The request timed out."} 
+0

'कनेक्शन लागू करें: didFailWithError:' प्रोटोकॉल विधि और देखें कि आपको त्रुटि के रूप में क्या मिलता है। – Malloc

+0

@ माल्कोक मेरे बुरे मैं इसे पोस्ट करना भूल गया। यह सिर्फ इतना कहता है कि कनेक्शन का समय समाप्त हो गया। –

+0

ठीक है, तो आपको त्रुटि स्टैक क्या मिला है? – Malloc

उत्तर

3

"मैं एक tableview सेल उपवर्ग में एक NSURLConnection है" - ऐसा कभी नहीं। चूंकि सुंग-पिल लिम पहले से ही सही तरीके से इंगित करता है, टेबलव्यू सेल का पुन: उपयोग किया जाएगा जो इस मुद्दे का कारण बन सकता है।

वैसे भी, आपके कनेक्शन का प्रतिक्रिया डेटा मॉडल की एक संपत्ति है। मॉडल इस डेटा को कैसे प्राप्त कर सकता है यह समेकित कर सकता है। यदि वह डेटा तुरंत पहुंचने के बाद उपलब्ध नहीं होता है, तो उसे इसके बजाय "प्लेसहोल्डर" मान प्रदान करना चाहिए और इस डेटा को पुनर्प्राप्त करने वाला एसिंक्रोनस कार्य शुरू करना चाहिए।

मान लीजिए कि एक मॉडल की संपत्ति, एक छवि, दृश्य नियंत्रक द्वारा दृश्य द्वारा प्रदर्शित करने के लिए उपयोग की जाएगी। मॉडल ने अभी तक अपनी वास्तविक छवि लोड नहीं की है - और इस प्रकार दृश्य को कुछ प्रदर्शित करने के लिए यह "प्लेसहोल्डर छवि" देता है। लेकिन साथ ही मॉडल छवि लोड करने के लिए एक असीमित कार्य शुरू कर रहा है। जब यह कनेक्शन डेटा के साथ लोड हो जाता है, तो मॉडल आंतरिक रूप से इसकी संपत्ति अपडेट करता है - जिससे प्लेसहोल्डर को वास्तविक छवि के साथ बदल दिया जाता है। संपत्ति का अद्यतन मुख्य धागे पर किया जाना चाहिए - चूंकि UIKit दृश्य एक ही संपत्ति तक पहुंच सकते हैं।

प्रारंभ के दौरान, व्यू कंट्रोलर मॉडल की संपत्ति के पर्यवेक्षक के रूप में पंजीकृत है (केवीओ देखें)। जब मॉडल की संपत्ति अपडेट की जाती है, तो नियंत्रक अधिसूचित हो जाता है। व्यू कंट्रोलर तब उचित क्रियाएं करता है ताकि दृश्य को फिर से खींचा जा सके और नए अपडेट किए गए मान को प्रदर्शित किया जा सके।

आपके मॉडल में "रद्द करें" विधि होनी चाहिए, जो मॉडल की संपत्ति के वास्तविक मूल्य की आवश्यकता नहीं होने पर मॉडल को नियंत्रक से भेजा जाएगा। उदाहरण के लिए, उपयोगकर्ता दूसरे दृश्य पर स्विच किया गया (देखें ViewWillDisappear)।

-1

जांच कर लें आपके url पते आरएफसी 2396. के अनुरूप है तो यह शामिल करना चाहिए HTTP: //

+0

उन्होंने पोस्ट किए गए यूआरएल –

2

मैं अपने कोड की कोशिश की।

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [self.downloadedData appendData:data]; 
    NSLog(@"%d", data.length); 
} 
2013-05-04 01:51:13.811 SomethingTodo[2732:c07] 1124 
2013-05-04 01:51:13.856 SomethingTodo[2732:c07] 1448 
2013-05-04 01:51:14.075 SomethingTodo[2732:c07] 1448 
2013-05-04 01:51:17.180 SomethingTodo[2732:c07] 1448 
2013-05-04 01:51:17.295 SomethingTodo[2732:c07] 1448 

यह काम कर रहा है ... ViewController

पर

के अनुरोध टाइमआउट त्रुटि 'कनेक्शन नेटवर्क के लिए लाया गया था। या ...

क्या आप UITableViewCell का पुनर्विक्रय कर रहे हैं? यदि आप सेल पुन: उपयोग कोड कनेक्शन के साथ सौदा शुरू करते हैं। शायद परेशानी लाओ। बस मैंने सोचा।

यदि आप अपने कोड अधिक संलग्न करते हैं। क्या मैं आपको और अधिक मदद कर सकता हूं।

0

मैं एक साफ स्लेट के साथ शुरू करूंगा और डाउनलोड करने के लिए केवल मूल कोड का उपयोग करूंगा। सबकुछ ट्रैक करने के लिए कई एनएसएलओजी में लोड करें। यदि यह काम करता है, तो अपना कस्टम कोड जोड़ना जारी रखें और देखें कि क्या आप किसी त्रुटि में ठोकर खा रहे हैं। मैं बुनियादी NSURLConnection कोड का सुझाव:

-(void)startDownloading:(NSString *)URLaddress{ 
NSLog(@"start downloading from: %@",URLaddress); 
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:[URLaddress stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]] 
              cachePolicy:NSURLRequestUseProtocolCachePolicy 
             timeoutInterval:60.0]; 
__unused NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
NSLog(@"didReceiveResponse: %@", response); 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
NSLog(@"didReceiveData"); 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
NSLog(@"Connection failed! Error - %@ %@",[error localizedDescription], [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
NSLog(@"connectionDidFinishLoading"); 
} 
0

एचसीडीउनलोड व्यू कंट्रोलर के साथ प्रयास करें और आप जांच सकते हैं कि कौन सी यूआरएल डाउनलोड नहीं की गई है। और अगली बार उस विशेष यूआरएल के लिए सिंक करें जो डाउनलोड नहीं किया गया है।

ज फ़ाइल

#import "HCDownloadViewController.h" 
@interface HomeViewController_iPhone : UIViewController<HCDownloadViewControllerDelegate> 
{ 
    HCDownloadViewController *tblDownloadHairStyle; 

} 
@property (nonatomic,retain) HCDownloadViewController *tblDownloadHairStyle; 

मीटर फ़ाइल

#define kAppDirectoryPath NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 

@synthesize tblDownloadHairStyle

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    tblDownloadHairStyle=[[HCDownloadViewController alloc] init]; 
    tblDownloadHairStyle.delegate=self; 
} 
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSHTTPURLResponse*)response 
{ 

    [self createDocumentDirectory:@"Downloaded_HairStyle"]; 
    NSString *pathHair=[self getDocumentDirectoryPath:@"Downloaded_HairStyle"]; 
    tblDownloadHairStyle.downloadDirectory = pathHair; 
    ////You can put url in for loop, it create queue for downloading. 
    [tblDownloadHairStyle downloadURL:[NSURL URLWithString:@"yourUrl"] userInfo:YourResponseDictonary]; 
} 


-(void)createDocumentDirectory:(NSString*)pStrDirectoryName 
{ 
    NSString *dataPath = [self getDocumentDirectoryPath:pStrDirectoryName]; 

    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) 
     [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:NULL]; 
} 

-(NSString*)getDocumentDirectoryPath:(NSString*)pStrPathName 
{ 
    NSString *strPath = @""; 
    if(pStrPathName) 
     strPath = [[kAppDirectoryPath objectAtIndex:0] stringByAppendingPathComponent:pStrPathName]; 

    return strPath; 
} 


#pragma mark- 
#pragma mark-HCDownloadViewController Delegate Method 
- (void)downloadController:(HCDownloadViewController *)vc startedDownloadingURL:(NSURL *)url userInfo:(NSDictionary *)userInfo { 

} 

- (void)downloadController:(HCDownloadViewController *)vc finishedDownloadingURL:(NSURL *)url toFile:(NSString *)fileName userInfo:(NSDictionary *)userInfo { 

    if (vc==tblDownloadHairStyle) { 
     if ([tblDownloadHairStyle numberOfDownloads]==0) { 

      NSLog(@"AllDownLoad are complete"); 
     } 
    } 
} 
- (void)downloadController:(HCDownloadViewController *)vc failedDownloadingURL:(NSURL *)url withError:(NSError *)error userInfo:(NSDictionary *)userInfo { 
    NSLog(@"failedDownloadingURL=%@",url); 
} 

https://github.com/H2CO3/HCDownload

-1

आप किसी भी पुस्तकालयों (TestFlight है, यूए, आदि) परियोजना में? उन्हें हटाने और पुनः परीक्षण करने का प्रयास करें। हमारे पास एक ऐप था जिसने टेस्टफ्लाइट एसडीके के साथ NSUrlConnection का उपयोग किया जो स्पोरैडिक नेटवर्क समस्याओं के सभी प्रकार के कारण हुआ।

NSURLConnection timing out

ASIHTTPRequest request times out

https://github.com/AFNetworking/AFNetworking/issues/307

+0

पहला लिंक 'NSURLConnection टाइमिंग आउट' कोड को संदर्भित करता है जो किसी भी तरह से सही तरीके से काम करने की संभावना नहीं है - और इसलिए वास्तविक समस्या का कोई अच्छा संकेत नहीं है। – CouchDeveloper

0

http-कनेक्टर पर HTTP प्रतिक्रिया कोड रेंज 200-299 और अक्षम कैशिंग के साथ किसी भी प्रतिक्रिया स्वीकार करते हैं।