IOS:存储,检索&调用代码块

时间:2012-11-20 09:29:48

标签: ios closures nsdictionary restkit

所以我正在使用restkit进行异步调用等等,感觉处理可能的连接问题的最佳方法之一就是拥有一个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];

所以我的问题是

在我要求它发布游戏对象的第一个片段中......那会有用吗?或者它会导致泄漏,游戏对象在与该调用相同的范围内声明,因此我唯一留下的指针是代码块中的指针。

我是否正确地将该块保存到字典中?

最后有没有人有更好的选择?或者在我的实施中发现需要纠正/修改的其他内容?

0 个答案:

没有答案