3

これはかなり典型的なシナリオですが、最善のアプローチが何であるかを知りたいです。

REST API と対話するアプリを構築する必要があるとしましょう。Web サーバーからのデータは、アプリ全体で複数の方法で表示されます。

通常、これを処理する方法は、すべてのデータ操作をシングルトンで処理することです (サーバーからのフェッチ/サーバーへの格納と、データのメモリへの保持の両方)。次に、たとえば、このデータをテーブルビューに表示したい場合は、アクセスします。このシングルトンは、データ ソース メソッドで直接使用できます。

したがって、基本的にアプリの一部がデータにアクセスする必要がある場合は、必ずシングルトンにアクセスしてアクセスします。

これはこれを行う良い方法ですか?もっと便利なパターンは他にありますか?

別の方法として、シングルトンにデータを保存する代わりに、各コントローラーにインスタンス変数を保持させて必要なデータを保存させ、シングルトンを使用してサーバーからフェッチするだけで、データ自体を保存することもできます。ここでの問題は、コントローラーが時期尚早に破棄されると、このインスタンス変数が消え、サーバー アクセスが無駄になることです (しかし、これは良いことでしょうか?)。

最後に、永続性をミックスに投入する場合の優れた戦略は何ですか? ネットワーク呼び出しとアプリの残りの部分の間に CoreData を配置するのが良い方法だと思いますか?

ここでの本当の質問は、サーバーから取得され、おそらく永続化されるべきデータを管理するための最良のアプローチは何ですか?

4

1 に答える 1

2

質問はちょっと広いですが、私が普段どのように働いているかを教えてください。

私は通常、この方法で実装された API クライアント用のシングルトンを持っています

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

次にRestKit、REST リソースをCoreDataエンティティに自動的にマップするために使用します。このアプローチの優れた点は、CoreData持続性を手動で処理する必要がないことRestKitですが、API リクエストのたびにそれを気にかけています。

私の API クライアントが行うことは、RestKitAPI をラップする便利なメソッドを提供することだけです。

たとえば、これは現在のユーザー情報を取得するための私の API です

- (void)getCurrentUserWithSuccess:(void (^)(HSUser *))success
                          failure:(void (^)(NSError *))failure {
    NSString * path = [NSString stringWithFormat:HS_API_USER_PATH, [HSUser currentUser].userId;
    [[RKObjectManager sharedManager] getObject:nil path:path parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        HSUser * user = [mappingResult firstObject];
        if (success) {
            success(user);
        }
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
        if (failure) {
            failure(error);
        }
    }];
}

私のコントローラーのロジックでは、次に呼び出すことができます

[[HSAPI sharedAPI] getCurrentUserWithSuccess:^(HSUser * user) {
    //do something
} failure:^(NSError * error) {
    //do something else
}];

そして、前に言ったように、そのような API 呼び出しの後、現在のユーザーに対応する HSUser インスタンスが自動的に永続化されます。

断然便利だと思います。

于 2013-03-28T20:07:41.027 に答える