【发布时间】:2013-05-17 15:27:15
【问题描述】:
我正在使用AFNetworking 库,这非常好,但是我在跟踪 NSOperationQueue 中的操作时遇到了麻烦。我正在将 NSOperation 对象添加到 NSOperationQueue,并且我需要跟踪进度 - 因此更新 UIProgressView 以显示队列完成的距离,然后在队列完成后执行一段代码。
我已经尝试过 KVO - 在这里使用答案:Get notification when NSOperationQueue finishes all tasks 但是我遇到了一个问题(详细说明了那里的第二个答案),有时队列中的操作可能完成得足够快,可以暂时将 operationCount 属性递减为 0 - 这会导致已接受答案中的代码出现问题 - 即在队列中的所有对象完成后过早执行要执行的代码,因此进度跟踪将不准确。
我尝试过的一个变体是在我添加到 NSOperationQueue 的每个 NSOperation 的成功块中检查 operationCount == 0,然后基于它执行代码,例如
[AFImageRequestOperation *imgRequest = [AFImageRequestOperation imageRequestOperationWithRequest:urlRequest success:^(UIImage *image) {
//Process image & save
if(operationQ.operationCount == 0){
// execute completion of Queue code here
}
else {
// track progress of the queue here and update UIProgressView
}
}];
但是,我遇到了与 KVO 相同的问题。
我考虑过使用 GCD 和使用完成块的调度队列 - 所以异步调度 NSOperationQueue 然后执行完成块,但这并不能解决我关于跟踪队列进度以更新 UIProgressView 的问题.
也没用过
AFHttpClient enqueueBatchOfHTTPRequestOperations:(NSArray *) progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations)progressBlock completionBlock:^(NSArray *operations)completionBlock
因为我的图片来自几个不同的网址(而不是一个基本网址)。
任何建议或指示将不胜感激。谢谢。
只是最后一次更新:
最终在 Matt 的帮助下使用 AFHTTPClient enqueueBatchOfHTTPRequestOperations 解决了这个问题(请参阅已接受的答案),并注意 cmets。
我确实遇到了另一个不使用 AFHTTPClient 而是单独使用 NSOperationQueue 的解决方案。我也将其包括在内,以防它对任何人都有用,但如果您使用的是 AFNetworking 库,我会推荐接受的答案(因为它最优雅且易于实施)。
【问题讨论】:
-
您看到链接问题的第二个答案了吗?这是解决问题的一种可能方法。
-
我确实看过那个 Cory,我尝试使用依赖项,但它仍然没有给我一个解决方案,除非我对该方法的应用不正确..
标签: ios objective-c afnetworking