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

在iphone应用程序中下载多个文件(目标c),iphone,cocoa,cocoa-touch,Iphone,Cocoa,Cocoa Touch,在我的iPhone应用程序中,我想下载IIS上具有身份验证的多个文件。点击一个按钮,我想开始下载过程 我知道如何下载具有身份验证的文件 NSURLRequest* request = [NSURLRequest requestWithURL:mMovieURL cachePolicy:NSURLRequestUseProtocolCachePolicy

在我的iPhone应用程序中,我想下载IIS上具有身份验证的多个文件。点击一个按钮,我想开始下载过程

我知道如何下载具有身份验证的文件

    NSURLRequest* request =
               [NSURLRequest requestWithURL:mMovieURL 
                             cachePolicy:NSURLRequestUseProtocolCachePolicy 
                             timeoutInterval:60.0];
    movieConnection =
            [[NSURLConnection alloc] initWithRequest:request delegate:self ];
我在上面的代码中有两个委托方法

但如何做到这一点与多个下行同时进行


谢谢,

当我想同时下载10个XML文件时,我曾经这样做过(这比排队一个接一个地下载要快得多)。我使用了这里的库:

它们很容易实现,首页上有一些示例代码可以帮助您入门

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;

祝你好运。

我不熟悉
多重下载
,但如果它不能满足你的需要,我认为问题是你有一个对象,它是许多
NSURLConnections
的委托,你想知道如何保持它们的正确性

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

NSString *key = [NSString stringWithFormat:@"%p", connection];
这将返回任何对象的唯一键(其地址的十六进制表示)。有些人使用
description
来实现这个目的,但我不喜欢这样,因为它不是一个定义良好的接口。没有人保证它是独一无二的。在我经常这样做的系统中,我在一个名为
-uniqueIdentifier
的方法中实现了上述
-stringWithFormat:
,并将其作为
NSObject
上的一个类别,以便可以在字典中跟踪任何内容

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


编辑:如Peter所述,将我上面的%x替换为%p。他是对的,我的想法不正确。仔细检查我的代码,我实际上一直在使用%p,之前遇到过这个错误……

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

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

这确实是让操作系统处理多个活动的一个很好的方法,并且与iPhone操作系统的延迟加载类型理念配合得很好

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


我现在已经将我的代码更改为所有这样工作的代码,并且发现它更加健壮,用户更加友好。

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];
我不熟悉这个 多重下载,但如果 不符合你的需要,我的问题 假设你有一张单人床 对象,该对象是多个 NSURLConnections,您想知道 如何保持他们的正直

委托方法都返回 NSURLConnection本身就是他们的第一个 参数这样你就可以跟踪 通过测试哪一个数据,哪一个数据去了哪里 NSURLConnection正在给您回电话。 一种方法是使用 映射连接的NSDictionary 到其NSMutableData对象。现在 诀窍是你不能做出正确的决定 NSURLConnection是 因为它不一致 去复印(你不会想要的) 至)。解决这个问题的一个方法是 使用连接的地址,例如 作为:

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


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

使用%p作为指针,而不是%x.%x是无符号整数,指针的大小不能保证与整数的大小相同(实际上,在64位版本的Mac OS x上,指针的大小不同)。现在可以使用将任意对象用作键。从文档中可以看出:“它的键或值可以在输入时复制,或者可以使用指针标识进行相等和散列。”这就消除了在这个解释中对键对象的需要。我不知道。如果其中一个文件发生错误怎么办。如果其中一个比其他的要花更长的时间呢。当它们全部完成时,您如何跟踪?问题是nsoperation无法处理异步下载,而异步下载将在稍后完成,而不是立即完成。我认为这不正确-我认为这确实是nsoperation的全部要点