Вы должны соблюдать свойство fractionCompleted
вашего объекта NSProgress
, используя KVO:
NSURL *url = [NSURL URLWithString:@"http://www.hfrmovies.com/TheHobbitDesolationOfSmaug48fps.mp4"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
NSProgress *progress;
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// …
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
[progress removeObserver:self forKeyPath:@"fractionCompleted" context:NULL];
// …
}];
[downloadTask resume];
[progress addObserver:self
forKeyPath:@"fractionCompleted"
options:NSKeyValueObservingOptionNew
context:NULL];
Затем добавьте метод наблюдателя:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"fractionCompleted"]) {
NSProgress *progress = (NSProgress *)object;
NSLog(@"Progress… %f", progress.fractionCompleted);
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
Конечно, вы должны проверить параметры keyPath
и/или object
, чтобы решить, является ли это объектом/свойством, которое вы хотите наблюдать.
Вы также можете использовать метод setDownloadTaskDidWriteDataBlock:
из AFURLSessionManager
(от которого наследуется AFHTTPSessionManager
), чтобы установить блок для получения обновлений о ходе загрузки.
[session setDownloadTaskDidWriteDataBlock:^(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
NSLog(@"Progress… %lld", totalBytesWritten);
}];
Этот метод AFNetworking отображает метод URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
из протокола NSURLSessionDownloadDelegate
в более удобный блочный механизм.
Кстати, реализация Apple KVO сильно нарушена. Я рекомендую использовать лучшую реализацию, подобную предложенной Майком Эшем, с MAKVONotificationCenter. Если вам интересно узнать, почему KVO от Apple не работает, прочитайте Наблюдение за ключом и значением выполнено правильно Майк Эш.
person
Sendoa
schedule
15.10.2013
AFHTTPRequestOperation
.AFURLSessionManager
работает только на iOS 7. Я опубликовал ответ, показывающий, как получить ход загрузки с помощьюAFHTTPRequestOperation
. - person TPoschel   schedule 17.10.2013