Своевременное чтение ответа от GCDAsyncSocket (iOS)

Эта проблема довольно проста, я просто не могу понять, как с ней справиться.

Я читаю данные с помощью:

[asyncSocket readDataWithTimeout:-1 tag:2];

NSString *failure = [serverJSONResponseParsed objectForKey:@"failure"];
NSLog(@"Contents of string failure: %@", failure);

if ([failure isEqualToString:@"none"]) {
    NSLog(@"Success Sending String");
    return TRUE;
}
else {
    NSLog(@"Failure: %@",failure);
    return FALSE;
}

Теперь, как и ожидалось, мой метод делегата вызывается и правильно считывает данные JSON:

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    NSError *error;
    NSLog(@"didReadData: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    serverJSONResponseParsed = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
    NSLog(@"didReadData test after dict: %@", [serverJSONResponseParsed objectForKey:@"failure"]);
}

Проблема в том, что поскольку GCDAsyncSocket является асинхронным, этот блок кода

NSString *failure = [serverJSONResponseParsed objectForKey:@"failure"];
NSLog(@"Contents of string failure: %@", failure);

if ([failure isEqualToString:@"none"]) {
    NSLog(@"Success Sending String");
    return TRUE;
}
else {
    NSLog(@"Failure: %@",failure);
    return FALSE;
}

после

[asyncSocket readDataWithTimeout:-1 tag:2];

Вызывается до того, как данные будут прочитаны. Как я могу обеспечить чтение данных, а затем их анализ.


person khaliq    schedule 19.08.2012    source источник


Ответы (1)


Этот блок кода должен быть в методе обратного вызова didReadData, например:

    -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
        NSError *error;
        NSLog(@"didReadData: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        serverJSONResponseParsed = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
        NSLog(@"didReadData test after dict: %@", [serverJSONResponseParsed objectForKey:@"failure"]);

    NSString *failure = [serverJSONResponseParsed objectForKey:@"failure"];
    NSLog(@"Contents of string failure: %@", failure);

    if ([failure isEqualToString:@"none"]) {
        NSLog(@"Success Sending String");
        return TRUE;
    }
    else {
        NSLog(@"Failure: %@",failure);
        return FALSE;
    }
}
person user523234    schedule 19.08.2012
comment
Спасибо. Я ценю, что вы ответили почти на все мои вопросы. - person khaliq; 19.08.2012