0

だから私は非同期呼び出しなどにrestkitを使用しています.可能な接続の問題を処理する最良の方法の1つは、単一のリクエストの配列を保持するrequestManagerを持つことであり、それをループし続け、成功するたびに削除します. 、このようにして、リクエストのペイロードを作成してマネージャーに追加することができ、アプリの残りの部分は、GET でない限り、返品を心配することなく続行できます...今私の問題は、リクエストのいくつかが必要に応じてクロージャまたはコード ブロックを使用します。

そして、構文とその使用法を適切に理解するのに苦労しています。特にブロックに関しては。

こんな感じで実装予定…

だから私は最初にこの電話をかける

GameInfo *game = [[GameInfo alloc] init];

game.myWTFID = [playerInfo _wtfID];
game.opponentWTFID = [gameInfoObj GetOpponentWTFID];
game.gameType = [NSNumber numberWithInt:[gameInfoObj gameType]];
game.turnNumber = [gameInfoObj GetTurnNumber];
game.lastMove = [gameInfoObj GetGameID];

[[RequestPayload sharedRequestPayload] addPutRequestForObject : game withSerializationMapping : serializedGameMap forClass : [Game class] withBlock :^(RKObjectLoader *loader) 
 {
     [loader setObjectMapping:gameMap];
     loader.delegate = self;
     loader.onDidLoadResponse = ^(RKResponse *response) 
     {
         [game release];
     };
     loader.targetObject = nil;
     loader.backgroundPolicy = RKRequestBackgroundPolicyRequeue;
 }
 ];

ここに実装があります

- ( void ) addPutRequestForObject : (id) object withSerializationMapping : (RKObjectMapping*) serialMapping forClass : (Class) class withBlock : ( void(^)(RKObjectLoader*) ) block 
{
    NSMutableDictionary *dict = [NSMutableDictionary new];

    NSNumber *postType = [[NSNumber alloc]initWithInt:1];

    [dict setObject:postType forKey:@"request"];
    [dict setObject:object forKey:@"data"];
    [dict setObject:serialMapping forKey:@"serialMapping"];
    [dict setObject:class forKey:@"class"];

    void (^ copyBlockLoader)(id,RKObjectMapping*) = Block_copy(block);
    [dict setObject:copyBlockLoader forKey:@"block"];
    Block_release(copyBlockLoader);


    [postType release];
    postType = nil;

    [_RequestsToInvoke addObject:dict];
}

次に、このようなことを行うために必要な情報を含むディクショナリになる配列内の各オブジェクトを通過した後の for ループ内。重要な部分はここにあると思いました。)

[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:[dict objectForKey:@"serialMapping"] forClass:[dict objectForKey:@"class"]];
void(^block)(RKObjectLoader *) = [dict objectForKey:@"block"];

[[RKObjectManager sharedManager] putObject:object usingBlock:block];

だから私の質問は

最初のスニペットでは、ゲーム オブジェクトを解放するように要求しています...うまくいきますか? または、ゲームオブジェクトがその呼び出しと同じスコープ内で宣言されているため、リークが発生するため、残っている唯一のポインターはコードブロック内のものです。

ブロックを辞書に正しく保存していますか?

そして最後に、誰かがより良い代替手段を持っていますか? または、修正/変更が必要な実装で何か他のものを見つけますか?

4

0 に答える 0