Подождите, прежде чем вернуть значение iPhone - PullRequest
0 голосов
/ 24 июля 2011

Я нашел несколько классов в Интернете, чтобы установить соединение TCP. Ссылка в здесь . Я хочу настроить класс, и до сих пор я могу установить соединение, отправлять данные и получать данные, и это здорово. После того как я создал и импортировал классы, использованные в первой предоставленной мной ссылке, я могу установить соединение, используя следующий метод:

-(void) connectToServerUsingCFStream:(NSString *) urlStr portNo: (uint) portNo {

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, 
                                       (CFStringRef) urlStr, 
                                       portNo, 
                                       &readStream, 
                                       &writeStream);

    if (readStream && writeStream) {
        CFReadStreamSetProperty(readStream, 
                                kCFStreamPropertyShouldCloseNativeSocket, 
                                kCFBooleanTrue);
        CFWriteStreamSetProperty(writeStream, 
                                 kCFStreamPropertyShouldCloseNativeSocket, 
                                 kCFBooleanTrue);

        iStream = (NSInputStream *)readStream;
        [iStream retain];
        [iStream setDelegate:self];
        [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                           forMode:NSDefaultRunLoopMode];
        [iStream open];

        oStream = (NSOutputStream *)writeStream;
        [oStream retain];
        [oStream setDelegate:self];
        [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                           forMode:NSDefaultRunLoopMode];
        [oStream open];    

    }
}

Поскольку я буду часто использовать этот класс в своем приложении, я создаю свой собственный класс и хочу создать метод -(BOOL) connect{}. Я хочу вернуть да, если соединение установлено, и нет иначе. Проблема в том, что я могу определить, устанавливаю ли я соединение, путем создания соединения, пытающегося отправить данные, а затем на стороне сервера я создал метод, который при получении сообщения отправляет строку обратно. Если в течение следующих 2 секунд я получаю данные, я знаю, что соединение было установлено.

поэтому в моем методе подключения я хочу подождать 2 секунды, а затем вернуть значение в зависимости от того, является ли переменная BOOL didReciveData = YES.

Ответы [ 2 ]

1 голос
/ 24 июля 2011

Вы можете попытаться приостановить основной цикл выполнения.

- (void)test
{
    NSLog(@"Test starting.");

    BOOL wasSuccessful = [self connect];
    NSLog(@"Success: %d", wasSuccessful);
}

- (BOOL)connect
{
    // try to connect here, make sure to get a callback on success/failure

    // fake callback
    [self performSelector:@selector(callback:) withObject:[NSNumber numberWithBool:NO] afterDelay:2.0];

    // wait for callback
    CFRunLoopRun();
    return self.success;
}

- (void)callback:(NSNumber *)successful
{
    self.success = [successful boolValue];

    CFRunLoopStop(CFRunLoopGetCurrent()); // now we want -connect to return!
}
1 голос
/ 24 июля 2011

Поскольку вы используете NSOutputStream, лучшим подходом может быть проверка возвращаемого значения [oStream write:]: если он возвращает -1, данные не были отправлены, поэтому соединение отсутствует.

Однако, если вы хотите подождать две секунды, вы можете использовать NSTimer для создания тайм-аута. Если вы получите ответ до того, как сработает таймер, вы можете сделать его недействительным, в противном случае таймер вызовет связанный метод, который уведомит об окончании двух секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...