2009-06-19 44 views
4

在我的iPhone應用程序中,我想要下載IIS上的多個文件並進行身份驗證。點擊一個按鈕,我想開始下載過程。下載iPhone應用程序中的多個文件(目標c)

我知道如何下載帶有認證的文件。

NSURLRequest* request = 
       [NSURLRequest requestWithURL:mMovieURL 
          cachePolicy:NSURLRequestUseProtocolCachePolicy 
          timeoutInterval:60.0]; 
    movieConnection = 
      [[NSURLConnection alloc] initWithRequest:request delegate:self ]; 

和我有幾個代表方法與上述代碼。

但是,如何與同時進行的多個下坡同時進行。

感謝,

回答

6

我時,我想下載,同時10個XML文件之前做到了這一點(它比排隊他們下載一個接一個的更快)。我曾經在這裏發現的庫:

http://github.com/leonho/iphone-libs/tree/master

他們易於實施和有頭版一些示例代碼,讓你開始。

self.urls = [NSMutableArray arrayWithObjects: 
    @"http://maps.google.com/maps/geo?output=json&q=Lai+Chi+Kok,Hong+Kong", 
    @"http://maps.google.com/maps/geo?output=json&q=Central,Hong+Kong", 
    @"http://maps.google.com/maps/geo?output=json&q=Wan+Chai,Hong+Kong", 
    nil]; 

self.downloads = [[MultipleDownload alloc] initWithUrls: urls]; 
self.downloads.delegate = self; 

祝你好運。

7

我不熟悉MultipleDownload,但如果它不能滿足您的需求,我認爲這個問題是您有一個單獨的對象,是許多NSURLConnections的代表,並且您想知道如何保持直線。

委託方法都返回NSURLConnection本身作爲它們的第一個參數。因此,您可以通過測試哪個NSURLConnection回撥您的信息來跟蹤哪些數據通過。一種方法是使用NSDictionary將連接映射到它的NSMutableData對象。現在的訣竅是,你不能讓NSURLConnection成爲字典中的關鍵字,因爲它不符合NSCopying(而且你不希望它)。解決方法之一是使用連接的地址,如:

NSString *key = [NSString stringWithFormat:@"%p", connection]; 

這將返回唯一鍵的任何對象(其地址的十六進制表示)。有些人爲此使用description,但我不喜歡那樣,因爲它不是一個明確定義的界面。沒有承諾它是唯一的。在我這樣做的很多系統中,我通過一種名爲-uniqueIdentifier的方法實現了上述-stringWithFormat:,並將其設置爲NSObject的類別,因此任何內容都可以在字典中進行跟蹤。

我經常發現創建一個小包裝對象是很容易的,所以每個對象都可以控制自己的NSURLConnection,就像我確信MultipleDownload正在做的一樣,但是這種技術在各種情況下都很有用,重新管理多個桌面視圖,或其他任何具有委託的視圖。

編輯:替換%x我已經在上面用%p指出了彼得。他是對的,我沒有正確思考。仔細檢查我的代碼,我實際上一直在使用%p,遇到此錯誤之前...

+1

將%p用於指針,而不是%x。 %x是無符號整數,並且指針不能保證與int的大小相同(實際上,在64位版本的Mac OS X中,它*的大小不是相同)。 – 2009-06-19 04:46:53

+0

固定。謝謝。你是絕對正確的。 – 2009-06-19 14:19:49

+0

現在可以使用[NSMapTable](https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/NSMapTable_class/Reference/NSMapTable.html)將任意對象用作鍵。從文檔:「它的鍵或值可能會複製輸入或可能使用指針標識進行相等和哈希。」這解釋了這個關鍵對象的需要。 – 2013-09-05 13:55:14

2

我認爲最簡單的方法是使用NSOperation - 和NSOperationQueue。

這意味着您可以指定每個操作是應該按順序還是並行進行。你甚至可以限制並行操作的數量 - 這樣一次最多可以運行5次(比如說),然後其他操作排在後面。

這真的是讓操作系統處理多個活動的好方法 - 並且適用於iPhone OS的延遲加載類型理念。

然後,您可以讓每個操作在完成時進行回調 - 甚至在主線程上進行回調。

我已經改變了我的代碼現在所有的工作方式,並發現它更健壯,用戶易怒。

0

NSURLConnection是異步的,init立即退出。只需多次運行它。

NSArray *connections = [[NSArray alloc] initWithObjects: 
    [[NSURLConnection alloc] initWithRequest:request1 delegate:self ], 
    [[NSURLConnection alloc] initWithRequest:request2 delegate:self ], 
    [[NSURLConnection alloc] initWithRequest:request3 delegate:self ], 
    [[NSURLConnection alloc] initWithRequest:request4 delegate:self ], 
    nil]; 
1

我不熟悉 MultipleDownload,但萬一它 不能滿足您的需求,我 把它的問題是,你有一個單一的 對象,它是代表了許多 NSURLConnections,你想知道 如何讓它們保持直線。

委託方法都返回 NSURLConnection本身作爲它們的第一個 參數。因此,您可以跟蹤 哪些數據會通過測試哪個 NSURLConnection回撥您。 執行此操作的一種方法是使用 NSDictionary,它將連接 映射到其NSMutableData對象。訣竅是你不能讓 NSURLConnection成爲 字典中的關鍵字,因爲它不符合 到NSCopying(並且你不希望它 )。來解決此的一種方式是 使用的連接的地址,例如 如:

的NSString *鍵= [NSString的 stringWithFormat:@ 「%P」,連接];

更好的辦法是使用NSValuevalueWithNonretainedObject構造函數。如果需要,您可以通過這種方式訪問​​NSDictionary中的關鍵對象。

相關問題