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