0

私のプロジェクトにはAPIModel、APIへの必要なすべての呼び出しを処理するシングルトンモデルクラスがあります。私はRestKitHTTPヘッダーを頻繁に使用して設定しています。

これは私の問題です:

AModel
- (void)makeRequest {
    [APIModel apiObject].getSpecificDataDelegate = self;
    [[APIModel apiObject] loadSpecificData];
}

BModel
- (void)makeRequest {
    [APIModel apiObject].getSpecificDataDelegate = self; // removes AModel as delegate so it ends up receiving both responses
    [[APIModel apiObject] loadSpecificData];
}

AModel自分自身を代理人として設定し、次にBModel自分自身を代理人として設定します。BModel最終的に両方のAPI応答を受信します。

これを解決するための私の解決策は、APIModelそれを必要とするクラスごとにのさまざまなインスタンスを起動することでした。

- (void)makeRequest {
    self.apiObject.getSpecificDataDelegate = self;
    [self.apiObject loadSpecificData];
}

- (APIModel *)apiObject {
    if (!_apiObject) apiObject = [[APIModel alloc] init]; // classes own instance
    return _apiObject;
}

何らかの理由で、これらのAPIModelインスタンスのすべてがHTTPヘッダーをリクエストに適切にアタッチすることは決してないため、API側ですべて失敗します。シングルトンオブジェクトをまだ使用しているモデルは、引き続き正常に機能します。

RKClientのシングルトン(sharedClient)の問題だと思いますが、よくわかりません。これはnilではなく、HTTPヘッダーを設定し、それらを印刷することもできますが、APIは例外をスローし続けます。シングルトンを使用していないときにHTTPヘッダーがリクエストにアタッチできないという明らかな理由はありますか?利用できる別の、またはより良いデザインパターンはありますか?

私はこの質問を見つけました。洞察に満ちていますが、私の問題とは完全には関連していませんが、同様のことを行う方法はありますか?

私は使用することを考えましたが、それから、それらのためのデータが何であるかを許可し、知るNSNotificationCenterために、より多くの情報を渡す必要があります。AModelBModel

4

1 に答える 1

0

単一のデリゲートを持つシングルトン=BADDESIGN。

あなたが見ているように、あなたはほとんどすぐに所有権の問題に遭遇します。

NSNotificationCenterを使用すると、通知とともに必要なだけの情報を渡すことができます。複数のオブジェクトがリクエストを実行できるシングルトンがあることは問題ありませんが、シングルトンと相互作用するオブジェクトが1つだけではない可能性があることに注意する必要があります。

そのようなことをしてください:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestSucceeded:) name:RequestSucceededNotification object:nil];

self.someID = @"Some_ID_You_Have";
//Doesn't have to be an ID, but you need a way to differentiate the notifications
[[APIModel apiObject] loadSpecificDataWithID:self.someID];

次に、APIModelクラスからデータを取得したら、次のように実行できます。

 [[NSNotificationCenter defaultCenter] postNotificationName:RequestSucceededNotification object:theID userInfo:@{@"data" : data}];

そして最後にAModelとBModelの両方で

- (void)requestSucceeded:(NSNotification *)notification
{
    if ([self.someID isEqualToString:[notification object]] == YES) {

        //Grab your data and do what you need to with it here
        NSData *data = [[notification userInfo] objectForKey:@"data"];
   }
}
于 2013-03-13T17:39:47.120 に答える