在我的iPhone应用程序中,我想下载IIS上的多个文件并进行身份验证。在按钮上单击我想开始下载过程。
我知道如何下载带身份验证的文件。
NSURLRequest* request =
[NSURLRequest requestWithURL:mMovieURL
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
movieConnection =
[[NSURLConnection alloc] initWithRequest:request delegate:self ];
我有几个委托方法与上面的代码。
但是如何与多个下载同时进行。
谢谢,
答案 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”,连接];
更好的方法是将NSValue
与valueWithNonretainedObject
构造函数一起使用。这样,如果必须,您可以从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];