Лучшая идея - загрузить файл асинхронно. Это имеет несколько преимуществ: наиболее важным является то, что ваш пользовательский интерфейс остается отзывчивым. Пользователь может продолжать использовать ваше приложение во время загрузки и ожидания данных. Если данные, которые вы загружаете, абсолютно необходимы для приложения, отобразите какой-то индикатор загрузки.
Вы можете легко запустить асинхронную загрузку через
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:sourceUrl]];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
Теперь, как мне получить данные загрузки в объекте NSData
? Для self
реализованы следующие методы делегата:
-connection:didReceiveData:
-connection:didFailWithError:
-connectionDidFinishLoading:
Идея состоит в том, что вы будете уведомлены, когда какие-либо данные попадают в ваше соединение или происходит что-то важное (например, успех или ошибка). Таким образом, вы собираетесь объявить временный объект NSMutableData
в качестве переменной экземпляра (скажем, downloadData
) и записывать его до завершения загрузки. Не забудьте инициализировать пустой объект и объявить свойство!
-connection:didReceiveData:
вызывается всякий раз, когда поступают какие-либо данные (то есть часть вашего загруженного файла). Итак, вы собираетесь добавить его к вашему временному объекту так:
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.downloadData appendData:data];
}
После завершения загрузки (успешно) вызывается следующий метод делегата:
-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
//do whatever you need to do with the data in self.downloadData
}
Если загрузка не удалась, вызывается -connection:didFailWithError:
. Затем вы можете сохранить временный объект, получить его размер и продолжить загрузку позже. [self.downloadData length];
возвращает вам размер в байтах данных вашего объекта.