Нужна помощь в загрузке данных с помощью NSURLConnection

Мое приложение - это приложение для обмена сообщениями, оно также может отправлять файлы изображений. Я просто загружаю изображение на веб-сервер, а с другой стороны просто отправляю его URL-адрес, с NSURLConnection я пытаюсь загрузить изображение с UIProgressView в качестве индикатора загрузки, вот мой код:

Этот метод вызывается при нажатии кнопки загрузки в uitableview, он удаляет кнопку загрузки, добавляет uiprogressview и начинает загрузку

-(void)downloadImage:(UIButton *)link
{
    UITableViewCell *cell = (UITableViewCell*)[link superview];

    NSIndexPath *pathToCell = [tView indexPathForCell:cell];

    NSMutableDictionary *checkItHasFile = [messages objectAtIndex:pathToCell.row];

    NSString *str = [checkItHasFile objectForKey:@"hasFile"];

    if([str isEqualToString:@"1"])
    {
        progress = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar];
        progress.frame = CGRectMake(10, 50, 160, 30);
        progress.progress = 0.0;

        //progress.center = CGPointMake(23,21);

        [cell addSubview:progress];
    }

    UIButton *view = [[UIButton alloc]init];
    NSArray *subviews = [cell subviews];

    for (view in subviews)
    {
        if([view isKindOfClass:[UIButton class]])
        {
            [view removeFromSuperview];
        }
    }

    //

    NSString *linkToPass = [NSString stringWithFormat:@"THE URL"];

    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:linkToPass]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    if (theConnection)
    {
        nsmd = [[NSMutableData alloc]init];
    }
    else
    {
        NSLog(@"Connection to server failed!");
    }
...

Этот метод является делегатом NSURLConnection, чтобы указать ответ, в нем я рассчитываю размер ответа

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
        [self.resourceData setLength:0];
        self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]];
} 

Этот метод является делегатом NSURLConnection для указания полученных данных. Я обновляю индикатор выполнения, выполняя некоторые вычисления

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    resourceData = [[NSMutableData alloc]init];
    [self.resourceData appendData:data]; 
    NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.resourceData length]];

    [self.progress setProgress:[resourceLength floatValue] / [self.filesize floatValue] animated:YES];
}

Я хочу знать, когда загрузка завершена, поэтому я также могу удалить представление о ходе выполнения, поскольку метод делегата - connectionDidFinishLoading: подключение NSURLConnection.

Проблема в том, что он запускается сразу же, поэтому, когда представление прогресса анимирует прогресс загрузки, этот метод также выполняется, если я удаляю здесь представление прогресса, оно немедленно исчезнет, ​​не указывая на полный прогресс загрузки.

Как решить эту проблему?


person S.J    schedule 15.11.2012    source источник
comment
например, если изображение размером всего 5 КБ, ваше соединение для передачи данных загрузит его внезапно. Попробуйте скачать большое изображение и действует ли оно так же сейчас. Затем, я думаю, вам нужно установитьProgress: method в didReceiveResponse: самому себе, чтобы вы могли показывать индикатор выполнения немного больше.   -  person Dinesh Raja    schedule 15.11.2012
comment
позвольте мне попробовать это .. спасибо за ответ :)   -  person S.J    schedule 15.11.2012
comment
похоже, что мой существующий код с большим файлом не работает должным образом, я не регистрирую данные загрузки, индикатор выполнения не увеличивается должным образом или останавливается посередине, пока все данные загружены :( ... что делать?   -  person S.J    schedule 15.11.2012
comment
перед загрузкой графический интерфейс также зависает ... все асинхронно, тогда почему графический интерфейс зависает ...   -  person S.J    schedule 15.11.2012


Ответы (1)


Определите метод, который удаляет индикатор выполнения, а затем в вашей - (void)connectionDidFinishLoading:(NSURLConnection *)connection реализации, если длина ресурса меньше определенной вами суммы, вызовите метод удаления с задержкой:

[self performSelector:@selector(removeProgressBar) withObject:nil afterDelay:2];

в противном случае вызовите тот же метод без каких-либо задержек.

person Michele Percich    schedule 15.11.2012