等待返回值iPhone



我在网上找到了一些建立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{}方法。如果连接建立,我想返回yes,否则返回no。问题是,我能够判断我是否建立连接的方式是通过创建一个尝试发送数据的连接,然后在服务器端我创建了一个方法,每当我收到我发送一个字符串回来。如果在接下来的2秒内我接收到数据,我就知道连接已经建立。

所以在我的连接方法中,我想等待2秒,然后根据BOOL变量didReciveData = YES返回一个值。

由于您使用NSOutputStream,因此更好的方法可能是检查[oStream write:]的返回值:如果它返回-1,则没有发送数据,因此没有连接。

然而,如果你想等待两秒钟,你可以使用NSTimer来创建一个超时。如果在计时器触发之前收到响应,则可以使计时器失效,否则计时器将调用相关的方法,该方法将通知两秒钟结束。

您可以尝试暂停主运行循环。

- (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!
}

最新更新