在我的 iOS 应用程序中,我正在使用 AFURLConnectionOperation 类(视图 A)上传图像,然后允许用户编辑图像的一部分(视图 B)。稍后,在视图 C 中,我有一个进度条,需要显示从视图 A 开始的上传进度。
我无法弄清楚如何使用 AFNetworking 从视图 C 中访问在视图 A 中启动的操作的进度。据我所知,这可能是不可能的。
提前致谢,
将要
在我的 iOS 应用程序中,我正在使用 AFURLConnectionOperation 类(视图 A)上传图像,然后允许用户编辑图像的一部分(视图 B)。稍后,在视图 C 中,我有一个进度条,需要显示从视图 A 开始的上传进度。
我无法弄清楚如何使用 AFNetworking 从视图 C 中访问在视图 A 中启动的操作的进度。据我所知,这可能是不可能的。
提前致谢,
将要
当然,Will 是可能的,它与 AFNetworking 几乎没有关系,但更多的是与常见的编程模式有关。
您将需要将AFURLConnectionOperation
对象存储在视图控制器之外,它们都可以访问它。这里的最佳实践是创建一个单例类来封装 AFNetworking 属性和方法来处理上传图像。每当您需要有关该上传的信息或与之交互时,您都可以通过类方法(如sharedInstance
.
+ (id)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
如果您正在与 Web 服务(而不是原始 FTP 服务器)进行交互,那么子类化 AFHTTPClient可能是“上传管理器”类型的类解决方案的最佳选择。
无论您选择什么,一旦您将一个简单的类放在一起,您就可以在 ViewControllers 的 viewWillAppear 中注册 KVO 通知并在 viewWillDisappear 中取消注册以干净地处理您的 UI 更新(例如进度条)。如果你不了解 Key-Value Observing,请阅读Introduction to Key-Value Observing Programming Guide。在掌握了这些知识之后,您将能够更好地应对 iOS。
因此,在视图 A 的上传代码中,使用您的神奇新类使用 URL 创建和排队上传(可以使用多种方法来使用内存中的图像、NSFileURLs 或 NSString,如此处所示)
[[MyImageUploadManager sharedInstance] uploadImageFromPath:@"/wherever/1.png" toURL:[NSURL URLWithString:@"ftp://someserver.com/images/"]];
…在视图 C 的控制器的 viewWillAppear 中
- (void) viewWillAppear:(BOOL)animated
{
...
[[MyImageUploadManager sharedInstance] addObserver:self forKeyPath:@"progress" options:NSKeyValueObservingOptionNew context:nil];
...
}
… 在视图 C 的视图中将消失
- (void)viewWillDisappear:(BOOL)animated
{
...
[[MyImageUploadManager sharedInstance] removeObserver:self forKeyPath:@"progress" context:nil];
...
}
每当您的上传管理器类中的“进度”属性发生变化时,iOS 都会调用该函数observerValueForKeyPath:ofObject:change:context:
。这是一个非常简单的版本:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ( [keyPath isEqualToString:@"progress"] )
{
// since you only upload a single file, and you've only added yourself as
// an observer to your upload, there's no mystery as to who has sent you progress
float progress=[change valueForKey:NSKeyValueChangeNewKey];
NSLog(@"operation:%@ progress:%0.2f", object, progress );
// now you'd update the progress control via a property bound in the nib viewer
[[_view progressIndicator] setProgress:progress];
}
else
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
这应该会让你在路上顺利,希望这对你有所帮助。