在iPhone应用程序中下载多个文件(目标c)

时间:2009-06-19 02:00:28

标签: iphone cocoa cocoa-touch

在我的iPhone应用程序中,我想下载IIS上的多个文件并进行身份验证。在按钮上单击我想开始下载过程。

我知道如何下载带身份验证的文件。

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

我有几个委托方法与上面的代码。

但是如何与多个下载同时进行。

谢谢,

5 个答案:

答案 0 :(得分:7)

我不熟悉MultipleDownload,但如果它不符合您的需求,我认为我有一个对象是许多NSURLConnections的委托,而且你想知道如何保持它们。

委托方法都将NSURLConnection本身作为第一个参数返回。因此,您可以通过测试哪个NSURLConnection正在呼叫您来跟踪哪些数据在哪里。一种方法是使用NSDictionary将连接映射到其NSMutableData对象。现在的诀窍是你不能让NSURLConnection成为字典中的键,因为它不符合NSCopying(你不希望它)。解决此问题的一种方法是使用连接的地址,例如:

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

这将返回任何对象的唯一键(其地址的十六进制表示)。有些人为此目的使用description,但我不喜欢它,因为它不是一个定义良好的界面。没有任何承诺,它是独一无二的。在我执行此操作的系统中,我在名为-stringWithFormat:的方法中实现上述-uniqueIdentifier并将其设为NSObject上的类别,以便可以在字典中跟踪任何内容。

我经常发现创建一个小的包装器对象更容易,因此每个对象控制它自己的NSURLConnection,就像我确信MultipleDownload正在做的那样,但是这种技术在各种情况,无论您是管理多个表视图,还是其他任何具有委托的内容。

编辑:如Peter所述,将%x替换为%p。他是对的,我没有正确思考。仔细检查我的代码,我实际上一直在使用%p,在遇到此错误之前......

答案 1 :(得分: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;
祝你好运。

答案 2 :(得分:2)

我认为最简单的方法是使用NSOperation - 和NSOperationQueue。

这意味着您可以指定每个操作是按顺序还是并行进行。您甚至可以限制并行操作的数量 - 这样一次最多运行5(比如说),然后其他操作排队。

这真的是让操作系统处理多项活动的好方法 - 并且适用于iPhone OS的延迟加载类型理念。

然后,您可以让每个操作在完成后进行回调 - 甚至在主线程上进行回调。

我已经将我的代码改为现在以这种方式工作,并且发现它更加强大且用户友好。

答案 3 :(得分:1)

  

我不熟悉   MultipleDownload,但万一   我不满足你的需求   拿它是你有一个单一的   对象是许多人的代表   NSURLConnections,你想知道   如何保持他们的正直。

     

委托方法都返回   NSURLConnection本身就是他们的第一个   参数。所以你可以跟踪   通过测试哪些数据去哪里   NSURLConnection正在给你回电话。   一种方法是使用   映射连接的NSDictionary   到它的NSMutableData对象。现在   诀窍是,你不能做一个   NSURLConnection是一个关键   字典,因为它不符合   到NSCopying(你不会想要它   至)。解决这个问题的一种方法是   使用连接的地址   为:

     

NSString * key = [NSString   stringWithFormat:@“%p”,连接];

更好的方法是将NSValuevalueWithNonretainedObject构造函数一起使用。这样,如果必须,您可以从NSDictionary访问密钥对象。

答案 4 :(得分: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];