Я начал писать простую библиотеку JSON RPC TCP в Objective C. У меня есть метод, который вызывает метод 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 отправляются с идентификатором через 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
и failure
, в настоящее время я храню их в NSMutableDict
, используя requestId в качестве ключа. Можно ли это сделать или есть лучший подход, который я должен использовать?
NSJSONSerialization
? и когда вы удаляете блоки из словаря обратного вызова? - person vikingosegundo   schedule 18.08.2014