2009-06-19 82 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中的关键对象。

相关问题