我开始在目标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;
}
现在,我不确定如何跟踪success
andfailure
块,当前我将它们NSMutableDict
使用requestId作为键存储在中。这样做是否合适,还是应该使用更好的方法?
Objective-C中的块是对象,您可以像对待其他对象一样对待它们,因此将它们存储在NSDictionarys,NSArrays等中非常好。唯一的问题是,最初创建的块与局部变量在同一个内存范围内,因此,当返回定义该块的方法时,它们就不再有效,就像所有其他局部变量一样,因此您必须先复制它们,只需复制它们,然后将副本放入集合中即可。有块复制功能,但是您可以向他们发送一条复制消息[myBlock copy];
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句