【问题标题】:NSURLConnection Progress Bar with sendAsynchronousRequest Objective-CNSURLConnection 进度条与 sendAsynchronousRequest Objective-C
【发布时间】:2014-03-21 16:44:22
【问题描述】:

我正在使用以下方法下载一堆较大的 zip 文件。这可能需要一点时间,所以我想显示一个进度条。

我研究了如何使用 NSURLConnection 的委托方法,这看起来很简单,但是我想用“sendAsynchronousRequest”实现同样的目的。如何获取下载时下载的字节数以及预期的总字节数,以便显示进度条?我了解,如果我以我正在执行的方式开始下载,我将无法使用委托方法。

// Begin the download process
- (void)beginDownload:(NSMutableArray *)requests {

    // Now fire off a bunch of requests asynchrounously to download
    self.outstandingRequests = [requests count];
    for (NSURLRequest *request in requests) { // Get the request
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

                                    // Error check
                                    if ( error != nil ) {

                                        // The alertview for login failed
                                        self.appDelegate.warningView.title = @"Refresh Error!";
                                        self.appDelegate.warningView.message = [error localizedDescription];

                                        // Show the view
                                        [self.appDelegate.warningView show];

                                        // Debug
                                        if ( DEBUG ) {
                                            NSLog(@"A request failed - %d left!",self.outstandingRequests);
                                        }

                                    }
                                    else {

                                        // Debug
                                        if ( DEBUG ) {
                                            NSLog(@"A request is done - %d left!",self.outstandingRequests);
                                        }

                                    }

                                    // Decrement outstanding requests
                                    self.outstandingRequests--;

                                    // No requests are left
                                    if (self.outstandingRequests == 0) {

                                       // Debug
                                       if ( DEBUG ) {
                                           NSLog(@"All requests are done!");
                                       }

                                       // Get rid of loading view
                                       [self performSelector:@selector(dismissLoadingView) withObject:nil afterDelay:0.15];

                                   }

                               }];

    }

}

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLConnectionDownloadDelegate_Protocol/NSURLConnectionDownloadDelegate/NSURLConnectionDownloadDelegate.html#//apple_ref/doc/uid/TP40010954-CH2-SW1

How to make an progress bar for an NSURLConnection when downloading a file?

http://iphonedevsdk.com/forum/iphone-sdk-development/24233-nsurlconnection-with-uiprogressbar.html

http://iphoneeasydevelopment.blogspot.com/2011/10/use-progess-bar-when-downloading-file.html

【问题讨论】:

    标签: ios iphone objective-c cocoa nsurlconnection


    【解决方案1】:

    sendAsynchronousRequest 不适用于您的目的,因为在请求完成之前它不会调用您的回调。您需要使用 initRequest:withDelegate: 并处理您自己的数据积累。

    当接收到标头时(可能多次重定向),您的 didReceiveResponse 方法将被调用,您可以在那里获取预期的大小:

    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        _expectedBytes = (NSUInteger)response.expectedContentLength;
        _data = [NSMutableData dataWithCapacity:_expectedBytes];
    
       // make a progress update here
    }
    

    每次收到一大块数据时,您都会收到对委托方法 didReceiveData 的调用,因此您知道到目前为止您已收到多少数据。

    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        [_data appendData:data];
        _receivedBytes = _data.length;
    
       // make a progress update here
    }
    

    【讨论】:

    • 另一种可能性是使用诸如 AFNetworking 之类的框架,它可以为您处理很多副戏,尽管对于非常简单的用途来说它可能会显得臃肿。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多