【问题标题】:How to use Progress parameter in AFNetworking 2.0如何在 AFNetworking 2.0 中使用 Progress 参数
【发布时间】:2013-10-26 14:58:59
【问题描述】:

我正在尝试将 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。

我不太确定如何使用。

【问题讨论】:

    标签: ios objective-c afnetworking afnetworking-2


    【解决方案1】:

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

    在这种情况下,您传入一个指向 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);
        }
    }
    

    【讨论】:

    • 挑剔它是指向指针的指针,而不是指针。实际的对象存在于堆上。为正确答案 +1 :)
    • @iWasRobbed,我知道在大多数方法中,我们必须像处理 NSError 一样使用进度。问题是我尝试从上传管理器排序中进行上传的视图类中收听进度。在我看来,我确实有经理对象。如果是本地(进度)变量,我如何收听进度。
    • @Vignesh 如果这回答了您的问题,请考虑通过点击复选标记关闭问题
    • 如果将调用添加到[super observeValueForKeyPath:ofObject:change:context:],会出现“消息已收到但未处理”之类的错误。
    • 有人能解释一下这里发生的内存分配吗?我在AFURLSessionManager 中看到*progress = delegate.progress;,其中progressAFURLSessionManagerTaskDelegate 强烈保留。那么,AFURLSessionManagerTaskDelegate 是否让局部变量保持活动状态?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多