gpt4 book ai didi

ios - NSProgress fractionCompleted 键值观察方法未调用

转载 作者:技术小花猫 更新时间:2023-10-29 11:17:57 27 4
gpt4 key购买 nike

我正在尝试使用 AFNetworking 和 NSProgress 跟踪我的 HTTP 请求的进度。基本上,我的请求是一个包含文本参数和图像数据的多部分表单数据,所有这些都在一个 block 中。

这是我的上传任务代码,对我来说似乎很简单也很正常:

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"<THE_API_URL>" parameters:nil constructingBodyWithBlock:constructionBlock];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

NSProgress *progress = [[NSProgress alloc] initWithParent:nil userInfo:nil];
[progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:NULL];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
// UI reacts to error
} else {
// Do stuff here
}
}];
[uploadTask resume];

现在,我不明白的是即使上传任务完成并成功,回调观察者方法也没有被调用。有人可以帮我理解为什么吗?这是我的代码。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) {
NSProgress *progress = (NSProgress *)object;
NSLog(@"Progress is: %f", progress.fractionCompleted);
}
}

更新:我遵循了 AFNetworking 的 uploadTaskWithStreamedRequest:... 方法代码,发现它们实际上是从内部替换了我的 NSProgress 对象uploadTaskWithTask:...。当然,如果 NSProgress 指针指向一个新实例,则该新实例不会注册为观察 fractionCompleted 属性。如何在不直接修改 AFNetworking 代码的情况下对这个新的 NSProgress 实例进行键值观察?

最佳答案

好吧,您需要做的就是在创建上传任务后将您的观察者移动到它会像魅力一样工作。

NSProgress *progress;

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
// UI reacts to error
} else {
// Do stuff here
}
}];
[uploadTask resume];

[progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:NULL];

关于ios - NSProgress fractionCompleted 键值观察方法未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21675934/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com