Как проверить целостность данных при использовании NSURLConnection sendSynchronousRequest? - PullRequest
1 голос
/ 17 января 2012

Я использую sendSynchronousRequest: returningResponse: метод ошибки класса NSURLConnection для получения NSData из сети.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

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

NSData *urlData;
do {
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if ([urlData length] != [response expectedContentLength]) {
        NSLog(@"WTF!!!!!!!!! NSURLConnection response[%@] length[%lld] [%d]", [[response URL] absoluteString], [response expectedContentLength], [urlData length]);
        NSHTTPURLResponse *httpresponse = (NSHTTPURLResponse *) response;
        NSDictionary *dic = [httpresponse allHeaderFields];
        NSLog(@"[%@]", [dic description]);
    }
} while ([urlData length] != [response expectedContentLength]);

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

Можете поделиться своим опытом или другими советами?

Спасибо.

1 Ответ

2 голосов
/ 18 марта 2012

Создайте две переменные в классе для хранения длины загруженных в настоящее время данных и ожидаемой длины данных (вы могли бы сделать более элегантно)

int downloadedLength;
int expectedLength;

Чтобы узнать длину ожидаемых данных, вы должны получитьэто от didReceiveResponse делегата

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

//    NSLog(@"expected: %lld",response.expectedContentLength);
    expectedLength = response.expectedContentLength;
    downloadedLength = 0;
}

, чтобы обновить загруженную длину, вы должны увеличить его в didReceiveData:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
downloadedLength = downloadedLength + [data length];
//...some code
}

, тогда можно сделать любую логику для сравнения, если загруженные данные соответствуют вашимтребования в connectionDidFinishLoading

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

    if (downloadedLength == expectedLength) {
        NSLog(@"correctly downloaded");
    }
    else{
        NSLog(@"sizes don't match");
        return;
    }
}

Я должен был сделать это, чтобы исправить проблемы библиотеки HJCache с большими изображениями, которые были загружены не полностью (в HJMOHandler).

...