2

iOSアプリでは、AFURLConnectionOperationクラスを使用して画像をアップロードし(ビューA)、ユーザーが画像の一部を編集できるようにします(ビューB)。後で、ビューCに、ビューAで開始されたアップロードの進行状況を表示する必要がある進行状況バーがあります。

ビューAで開始した操作の進行状況にAFNetworkingを使用してビューC内からアクセスする方法がわかりません。私の知る限りでは不可能かもしれません。

前もって感謝します、

意思

4

1 に答える 1

3

もちろん、Willは可能であり、AFNetworkingとはほとんど関係がありませんが、一般的なプログラミングパターンとはもっと関係があります。

オブジェクトをViewControllerの外部に保存して、AFURLConnectionOperation両方がアクセスできるようにする必要があります。ここでのベストプラクティスは、画像のアップロードを処理するためのAFNetworkingプロパティとメソッドをカプセル化するシングルトンクラスを作成することです。そのアップロードに関する情報が必要な場合、またはそのアップロードと対話する必要がある場合はいつでも、のようなクラスメソッドを介してそのシングルトンにアクセスできますsharedInstance

+ (id)sharedInstance
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

(生のFTPサーバーではなく)Webサービスと対話している場合は、AFHTTPClientをサブクラス化することが、「アップロードマネージャー」タイプのクラスソリューションにとっておそらく最善の策です。

どちらを選択しても、単純なクラスをまとめたら、ViewControllerのviewWillAppearでKVO通知に登録し、viewWillDisappearで登録を解除して、UIの更新(プログレスバーなど)を適切に処理できます。Key-Value Observingを理解していない場合は、 『Introduction to Key-Value Observing Programming Guide』をお読みください。あなたはあなたのベルトの下でその知識を持っている後、iOSではるかに対処することができるでしょう。

したがって、ビューAのアップロードコードで、魔法の新しいクラスを使用して、URLを使用してアップロードを作成し、キューに入れます(ここに示すように、メモリ内の画像、NSFileURL、または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のviewWillDisappearで

- (void)viewWillDisappear:(BOOL)animated
{
    ...
    [[MyImageUploadManager sharedInstance] removeObserver:self forKeyPath:@"progress" context:nil];
    ...
}

アップロードマネージャークラスでその「progress」プロパティが変更されるたびに、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 に答える