gpt4 book ai didi

ios - nsdictionary 中的 block ?

转载 作者:可可西里 更新时间:2023-11-01 04:27:31 25 4
gpt4 key购买 nike

所以我将 block 操作存储到一个 nsmutabledictionary 中,然后在响应返回到 websocket 时调用它们。这会将异步请求变成 block 语法。这是精简代码:

- (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 链接到每个请求。

这很完美,比我预期的要好。我的问题是这样运行 block 安全吗?正在调用 [messageBlocks removeObjectForKey:correlationID];足以将其从内存中删除。我记得在 ARC 之前,block_release 是一个选项。

最佳答案

您需要复制基于堆栈的 block ,以便将它们安全地存储在容器中。

[self.messageBlocks setObject:[responseAction copy] forKey:correlationID];

对于非 ARC 代码,您还需要-autorelease它。

[self.messageBlocks setObject:[[responseAction copy] autorelease] forKey:correlationID];

希望对您有所帮助。

关于ios - nsdictionary 中的 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12310374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com