При изменении контроллеров представления делегат NSURLConnection не обновляет индикатор выполнения

Я выполняю загрузку через класс 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);
        }


}

Скажите, пожалуйста, как я могу сохранить значение индикатора выполнения, возвращаясь на страницу и обновляя его.


person MeghaJain    schedule 21.11.2013    source источник
comment
Как новый пользователь, возможно, вы не полностью понимаете, как работает этот сайт - если кто-то отвечает на ваш вопрос, и он помогает вам или решает проблему, то предполагается, что исходный постер выберет ответ, нажав на галочку под ответом. Другие люди будут избегать ваших вопросов, если вы задаете много вопросов, но никогда не выбираете ответы.   -  person David H    schedule 25.11.2013


Ответы (1)


Измените своего представителя на этого, а затем обновите вопрос. Я подозреваю, что вы обнаружите, что утверждения:

-(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];
}

Если вы не получаете никаких утверждений, вы по-прежнему получаете сообщения делегата, а индикатор выполнения не отображается (или не движется), затем зарегистрируйте значение прогрессивного кадра и / или кадра индикатора выполнения.

person David H    schedule 21.11.2013
comment
да .. проблема была с делегатом. я сделал другого делегата, а затем произошло обновление. Большое спасибо за эту помощь. - person MeghaJain; 25.11.2013
comment
Не могли бы вы обновить, как вы исправили этот @MeghaJain? Что вы имеете в виду, говоря, что сделали еще одного делегата? - person Maneesh Sharma; 26.07.2017
comment
@ManeeshSharma Я считаю, что он имел в виду, что у него был один VC в качестве делегата, и когда он был уволен, делегата не было. Поэтому он передал делегирование другому ВК. Обычно мне не нравится этот подход, я бы предпочел, чтобы все сообщения обрабатывались синглтоном, тогда венчурные капиталисты могут связываться с ним, чтобы определять прогресс и т. Д. Это говорит о многих способах решения этой проблемы. - person David H; 26.07.2017
comment
Спасибо, Дэвид! И это «Она», а не «Он». Более того, My class обновляется новым экземпляром класса. Но методы делегата NSURLSession почему-то не обновляются, даже если я вызываю self. Они сохраняют старый экземпляр класса - person Maneesh Sharma; 27.07.2017