在返回值iPhone之前等待

时间:2011-07-24 14:37:03

标签: iphone objective-c tcp

我在互联网上找到了一些建立tcp连接的课程。该链接位于here。我想自定义一个类,到目前为止,我能够建立连接发送数据和接收数据,这是伟大的。一旦我创建并导入了我提供的第一个链接使用的类,我就可以使用以下方法建立连接:

-(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 个答案:

答案 0 :(得分:1)

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

但是,如果要等待两秒钟,可以使用NSTimer创建超时。如果在定时器触发之前收到响应,则可以使定时器无效,否则定时器将调用相关方法,该方法将通知两秒钟结束。

答案 1 :(得分:1)

您可以尝试暂停主循环。

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