12

我正在尝试将 AFNetworking 2.0 与 NSURLSession 一起使用。我正在使用该方法

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
                                         fromFile:(NSURL *)fileURL
                                         progress:(NSProgress * __autoreleasing *)progress
                                completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler;

我应该如何使用进度参数。该方法是非阻塞方法。因此,我将不得不收听“ progress”以获取更新。但是该参数不会采用属性。只需要一个局部变量(NSProgress * __autoreleasing *)。我无法将 KVO 添加到本地 var。

我不确定如何使用。

4

1 回答 1

25

任何时候给出一个参数,因为**这意味着你应该传递指向现有对象的指针,而不是像往常那样指向实际对象的指针。

在这种情况下,您传入一个指向NSProgress对象指针的指针,然后观察该对象的变化以获取更新。

例子:

// Create a progress object and pass it in
NSProgress *progress;
[sessionManager uploadTaskWithRequest:request fromFile:fileURL progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    // Completion code
}];

// Observe fractionCompleted using KVO
[progress addObserver:self
          forKeyPath:@"fractionCompleted"
             options:NSKeyValueObservingOptionNew
             context:NULL];

然后它被报告在:

- (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);
    }
}
于 2013-10-18T02:05:58.007 回答