如何在Objective C中存储块?

皮拉特

我开始在目标C中编写一个简单的JSON RPC TCP库。我有一个调用RPC方法的方法:

- (void)invokeMethod:(NSString *)method
      withParameters:(id)parameters
           requestId:(id)requestId
             success:(void (^)(id responseObject))success
             failure:(void (^)(NSError *error))failure
{
    NSAssert(NSClassFromString(@"NSJSONSerialization"), @"NSJSONSerialization not found!");
    NSDictionary *requestObject = @{@"jsonrpc": @"2.0",
                                    @"method": method,
                                    @"params": parameters,
                                    @"id": requestId};
    NSError *error = nil;
    NSData *jsondData = [NSJSONSerialization dataWithJSONObject:requestObject options:0 error:&error];
    if (error){
        return failure(error);
    }
    [self->callbacks setObject:@{@"success": success ? [success copy] : [NSNull null],
                                 @"failure": failure ? [failure copy] : [NSNull null]}
                        forKey:requestId];
    NSString *str = [[NSString alloc] initWithData:jsondData encoding:NSUTF8StringEncoding];
    NSLog(@"Sending: %@", str);
    [self.socket writeData:jsondData withTimeout:-1 tag:1];
}

该类基本上表示一个TCP连接,当调用上述方法时,JSON数据将以id的形式通过TCP发送到服务器,该服务器将返回成功或失败:

- (void) socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag
{
    NSError *error = nil;
    [self.socket readDataWithTimeout:-1 tag:2];
    // … rpc response parsing code here, removed for simplicity …
    // detect if error or success
    NSDictionary *cbs = [self->callbacks objectForKey:JSONRPCObjectId];
    void(^success)(id resultObject) = [cbs objectForKey:@"success"];
    success ? success(JSONRPCObjectResult) : nil;
    return;
}

现在,我不确定如何跟踪successandfailure块,当前我将它们NSMutableDict使用requestId作为键存储在中这样做是否合适,还是应该使用更好的方法?

内森·戴

Objective-C中的块是对象,您可以像对待其他对象一样对待它们,因此将它们存储在NSDictionarys,NSArrays等中非常好。唯一的问题是,最初创建的块与局部变量在同一个内存范围内,因此,当返回定义该块的方法时,它们就不再有效,就像所有其他局部变量一样,因此您必须先复制它们,只需复制它们,然后将副本放入集合中即可。有块复制功能,但是您可以向他们发送一条复制消息[myBlock copy];

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章