更改视图控制器时NSURLConnection委托不更新进度条

时间:2013-11-21 07:29:34

标签: ios download nsurlconnection uiprogressview

我正在通过NSURLConnection类进行下载,并根据NSURLConnection delegate连接didReceiveData中收到的字节更新进度条视图。

当我在正在进行下载的页面上时,一切正常,但是当我要访问其他视图控制器并返回到我的下载页面时,页面转换时正在调用连接delegate函数但回来并不会升级progress栏。

我使用的代码是:

- (IBAction)download:(id)sender {
    _currentURL = [NSString stringWithFormat:@"url_to_download"];
    NSURL *url =[NSURL URLWithString:_currentURL];
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];

    _receivedData = [[NSMutableData alloc]initWithLength:0];
    connection2 = [[NSURLConnection alloc]initWithRequest:theRequest delegate:self startImmediately:YES];
}


-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSLog(@"THE STATUS CODE IS %d",[httpResponse statusCode]);
    statuscode = [httpResponse statusCode];
    NSLog(@"into didReceiveResponse");
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    [_receivedData setLength:0];
    expectedBytes = [response expectedContentLength];
    NSLog(@"EXPECTED BYTES:%ld",expectedBytes);
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"into did receivedata");
    [_receivedData appendData:data];

        self.setting.enabled = NO;
        float progressive = (float)[_receivedData length] / (float)expectedBytes;
        [self.progress setProgress:progressive];

}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
   AppDelegate *app = (AppDelegate*) [[UIApplication sharedApplication]delegate];
    NSLog(@"into didfailwitherror");
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    NSLog(@"connection failed");


}

-(NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
    return nil;
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

{

        self.setting.enabled = YES;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSLog(@"DOCUMENT DIRECTORY :%@",documentsDirectory);

        _imagePath = [documentsDirectory stringByAppendingPathComponent:_fullPath];
        NSLog(@"iamge path:%@",_imagePath);
        NSLog(@"succeeded");
        [UIApplication sharedApplication].networkActivityIndicatorVisible= NO;
        NSLog(@"Succeeded! Received %d bytes of data",[_receivedData length]);

        // flag= [_receivedData writeToFile:imagePath atomically:NO];
        if([_receivedData writeToFile:_imagePath atomically:YES])
        {

            NSLog(@"write successfull");
            app.dl_status = 0;
            [HUD hide:YES];
            [HUD removeFromSuperview];
            HUD = nil;
            [self completedDownloadHUD];
            [self.download setBackgroundImage:[UIImage imageNamed:@"download.png"] forState:UIControlStateNormal];
        }
        else{
            app.dl_status = 0;
            NSLog(@"write failed");
            [HUD hide:YES];
            [self errorDownloadHUD];
        }

        NSString *imagePathExtension;
        imagePathExtension = [_imagePath pathExtension];
        if([imagePathExtension isEqual:@"jpg"])
        {
            NSLog(@"imagepathextension is jpg");
            UIImage *img =[UIImage imageWithContentsOfFile:_imagePath];
            UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);

        }
        else if([imagePathExtension isEqual:@"mov"])
        {
            NSLog(@"imagepathextension is mp4");
            UISaveVideoAtPathToSavedPhotosAlbum(_imagePath, nil, nil, nil);
        }


}

请告诉我如何在返回页面并更新时保留进度条的值。

1 个答案:

答案 0 :(得分:0)

将您的委托更改为此,然后更新问题。我怀疑你会发现一些东西被断言:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"into didReceiveData");
    [_receivedData appendData:data];
    assert(_receivedData); // it exists
    assert([_receivedData length]); // it also has some data in it 

    self.setting.enabled = NO;
    float progressive = (float)[_receivedData length] / (float)expectedBytes;
    assert(expectedBytes > 0);
    assert(progressive > 0 && progressive <= 1);
    assert(self.progress);
    assert(!self.progress.hidden);
    assert(!self.progress.alpha > 0.5);
    assert(self.progress.window);
    [self.progress setProgress:progressive];
}

如果您没有收到任何断言,您仍然会收到委托消息,并且进度条不可见(或不移动),然后记录渐进式和/或进度条框架的值。