2011-03-16 75 views
1

我想從網絡服務器下載文件。在iphone上下載多個文件

場景: 用戶將選擇行(文件名 - 用戶可以選擇1個或多個文件下載),然後按下載,我將獲取每個文件的URL(全部具有不同的URL)並存儲到pathArray中。 如果我不使用for循環即只有一個文件的下載那麼它工作正常,但不與循環做以下

-(void)downloadFile { 
    for (int i = 0; i<[pathArray count]; i++) {  
     NSURL *fileURL = [NSURL fileURLWithPath:[pathArray objectAtIndex:i]]; 

     NSString *ResultURL = [fileURL absoluteString]; 
     NSURL *url = [[NSURL alloc] initWithString:ResultURL]; 
     NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL: url 
     cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval: 60.0]; 
     conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 

     if (conn) { 
      NSLog(@"*************CONNECTED************"); 
      webData = [[NSMutableData data] retain]; 
      NSLog(@"weblength : %d : ", [webData length]); 
      downloadTag = YES; 
     } else { 
      NSLog(@"*************Connection NOT DONE************"); 
      downloadTag=NO; 
     } 
    } 
} 


-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    NSLog(@"*************Try to receive data************"); 
    [webData appendData:data]; 
    NSLog(@"weblength : %d : ", [webData length]); 
    NSLog(@"*************Data Received an append too ***********"); 
    if (downloadTag == YES) { 
     paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
     self.documentsDir = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"NewResult.zip" ]; 
     [[NSFileManager defaultManager] createFileAtPath:documentsDir contents:nil attributes:nil]; 
     NSFileHandle *file1 = [NSFileHandle fileHandleForUpdatingAtPath: documentsDir]; 
     [file1 writeData: webData]; 
     NSLog(@"Webdata : %d",[webData length]); 
     [file1 closeFile]; 
    } 
}  

....它真的非常重要,我來解決這個問題。

非常感謝你

+0

我唯一能說的是,在你當前的循環中,你將發送多個異步請求,但是將數據收集在一個數組中......除非我錯過了某些東西,它將無法工作。 – MiKL

+0

@MiKL,我應該怎麼做呢..請解釋我多一點...我非常困惑。感謝 – Pooja

+0

你總是可以使用'NSURLConnection'來下載信息,例如文件的存儲位置,然後下載它使用'[NSData dataWithContentsOfURL:(NSURL *)]'。要在單獨的線程下載,你可以使用'NSAutoreleasePool',然後調用'NSData'方法。 –

回答

1

您使用異步下載一個很好的隊列,但每個下載項目的委託是一樣的對象,導致所有下載的數據被追加到同一個文件中。我這樣做的方式是有一個小對象(DownloadQueueItem),它是單次下載的代表。當你下載另一個文件時,你創建一個新的DownloadQueueItem並且它處理一切。


編輯:

問:代替%我把我的自我我正在尋找有沒有什麼辦法一樣,如果「」 NewResult.zip」是存在,則每次創建新文件打造 「NewResult1.zip」 等

答:你可以做這樣的事情:

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *filename = @"NewResult%@.zip"; 
for (int i = 0; ; i++) { 
    NSString *filename = NULL; 

    if (i == 0) { 
     filename = [NSString stringWithFormat:filename, @""]; 
    } 
    else { 
     filename = [NSString stringWithFormat:filename, [NSString stringWithFormat:@"%i", i]]; 
    } 

    if (![[NSFileManager defaultManager] fileExistsAtPath:filename]) { 
     // Save file. 
     break; 
    } 
} 
+0

我嘗試使用同步和它的工作正常,但現在唯一的問題是它覆蓋到我現有的文件,現在我必須搜索如何創建新的文件,每次不覆蓋舊的 – Pooja

+0

我正在使用, NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); documentsDir = [[路徑objectAtIndex:0] stringByAppendingPathComponent:@「NewResult.zip」]; [[NSFileManager defaultManager] createFileAtPath:documentsDir contents:nil attributes:nil]; NSFileHandle * file1 = [NSFileHandle fileHandleForUpdatingAtPath:documentsDir]; 因此,對於每次遇到它應該創建「NewResult1.zip」,「NewResult2.zip」...等等 – Pooja

+0

你的邏輯是對的,但我不認爲你的代碼正在做你告訴我的。它看起來只是使用單個文件進行保存。你需要做更多的事情:'documentsDir = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@「NewResult%i.zip」,counter]];'其中counter是文件的下載編號。 – FreeAsInBeer