блоки в обязательном порядке?
Так что я'm хранит действия блока в nsmutabledictionary и затем вызывает их, когда ответ возвращается в веб-сокет. Это превращает асинхронный запрос в блочный синтаксис. Вот'урезанный код:
- (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];
}
}
Примечание. Сервер отвечает ID корреляции, который отправляется вместе с запросом. Таким образом, каждый ответ связан с каждым запросом через этот идентификатор.
Это работает отлично, лучше, чем я ожидал. Вопрос, который у меня возник, заключается в том, безопасно ли запускать блоки таким образом? Вызывает [messageBlocks removeObjectForKey: correlationID]; достаточно, чтобы удалить его из памяти. Я помню pre-ARC, block_release был вариант.