2

在我的 iOS 应用程序中,我正在使用 AFURLConnectionOperation 类(视图 A)上传图像,然后允许用户编辑图像的一部分(视图 B)。稍后,在视图 C 中,我有一个进度条,需要显示从视图 A 开始的上传进度。

我无法弄清楚如何使用 AFNetworking 从视图 C 中访问在视图 A 中启动的操作的进度。据我所知,这可能是不可能的。

提前致谢,

将要

4

1 回答 1

3

当然,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];
    }
}

这应该会让你在路上顺利,希望这对你有所帮助。

于 2012-12-20T19:33:39.980 回答