SJo*_*ils 5 cocoa-touch nsmutabledictionary websocket ios objective-c-blocks
所以我将块动作存储到一个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];
}
}
Run Code Online (Sandbox Code Playgroud)
注意:服务器使用随请求发送的correlationID进行响应.因此,每个响应都通过该ID链接到每个请求.
这完美,比我预期的更好.我的问题是以这种方式运行块是否安全?正在调用[messageBlocks removeObjectForKey:correlationID]; 足以将其从内存中删除.我记得pre-ARC,block_release是一个选项.
您需要复制基于堆栈的块才能将它们安全地存储在容器中.
[self.messageBlocks setObject:[responseAction copy] forKey:correlationID];
Run Code Online (Sandbox Code Playgroud)
对于非ARC代码,您也需要-autorelease它.
[self.messageBlocks setObject:[[responseAction copy] autorelease] forKey:correlationID];
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
3725 次 |
| 最近记录: |