因此,我将块操作存储到 nsmutabledictionary 中,然后在 Websocket 上返回响应时调用它们。这会将异步请求转换为块语法。这是精简的代码:
- (void)sendMessage:(NSString*)message responseAction:(void (^)(id))responseAction
{
NSString *correlationID = (NSString*)[[message JSONValue] objectForKey:@"correlationId"];
[self.messageBlocks setObject:responseAction forKey:correlationID];
NSLog(@"Sending message: %@", correlationID);
[webSocket send:message];
}
- (void)webSocket:(SRWebSocket *)wsocket didReceiveMessage:(id)message;
{
NSString *correlationID = (NSString*)[[message JSONValue] objectForKey:@"correlationId"];
NSLog(@"Incoming message. CorrelationID: %@", correlationID);
void (^action)(id) = nil;
if (correlationID) {
action = [messageBlocks objectForKey:correlationID];
if (action) action([message JSONValue]);
[messageBlocks removeObjectForKey:correlationID];
}
}
注意:服务器使用与请求一起发送的correlationID 进行响应。因此每个响应都通过该 id 链接到每个请求。
这工作完美,比我预期的要好。我的问题是,以这种方式运行块安全吗?正在调用 [messageBlocks removeObjectForKey:correlationID];足以将其从记忆中删除。我记得在 ARC 之前,block_release 是一个选项。
您需要复制基于堆栈的块,以便将它们安全地存储在容器中。
[self.messageBlocks setObject:[responseAction copy] forKey:correlationID];
对于非 ARC 代码,您需要-autorelease
它也是。
[self.messageBlocks setObject:[[responseAction copy] autorelease] forKey:correlationID];
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)