Не удалось скачать файл с NSURLRequest

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

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE

и вот что я сделал:

NSMutableData *testFileType;
// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                              timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    testFileType = [[NSMutableData data] retain];
    NSLog(@"the connection is successful");
} else {
    // Inform the user that the connection failed.
    NSLog(@"the connection is unsuccessful");
}

[testFileType setLength:0];
[testFileType appendData:[NSMutableData data]];

Кто-нибудь может сказать мне, что мне здесь не хватает?

2 ответа

Просто создание NSURLConnection недостаточно. Вам также необходимо реализовать методы делегата didReceiveResponse и didFinishLoading. Без этого соединение загружает файл, но вы никогда не увидите его.

NSURLConnection отправляет didReceiveResponse для каждого перенаправления при получении заголовков. Затем он отправляет didReceiveData с некоторыми байтами файла. Те, которые вам нужно добавить к вашим изменяемым данным. Наконец, вы получаете didFinishLoading, где вы знаете, что вы получили все данные. В случае ошибки вы получаете вместо этого didFailWithError.

Посмотрите документацию по протоколу NSURLConnectionDelegate: https://developer.apple.com/library/mac/ipad/#documentation/Foundation/Reference/NSURLConnectionDelegate_Protocol/Reference/Reference.html.

Вы должны реализовать следующие методы делегата:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"Error: %d %@", [error code], [error localizedDescription]);
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    responseData = [NSMutableData data];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [responseData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [responseData writeToFile:savePath atomically:YES]; 
}

здесь responseData и savePath являются переменными экземпляра, объявленными с помощью:

NSMutableData *responseData;
NSString *savePath;

и ваш класс должен соответствовать NSURLConnectionDataDelegate а также NSURLConnectionDelegate протоколы.

Чтобы код работал, вы, вероятно, захотите установить savePath на рабочий путь, подобный этому

NSString *savePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"testfile.txt"];

После завершения загрузки вы можете сделать что угодно с файлом на savePath как хотите.

Другие вопросы по тегам