Objective c 为什么后台侦听的DataCallBack方法没有被调用?

Objective c 为什么后台侦听的DataCallBack方法没有被调用?,objective-c,iphone,sockets,cfnetwork,Objective C,Iphone,Sockets,Cfnetwork,我一直在与CFNetwork合作,为iPad创建一个客户端应用程序,它是一个小应用程序,没有什么特别之处 这就是我如何创建到windows中运行的服务器的连接 - (void) startConnection { char ip[] = "192.168.0.244"; NSString *ipAddress = [[NSString alloc] initWithCString:ip]; /* Build our socket context; this ties a

我一直在与CFNetwork合作,为iPad创建一个客户端应用程序,它是一个小应用程序,没有什么特别之处

这就是我如何创建到windows中运行的服务器的连接

- (void) startConnection
{
    char ip[] = "192.168.0.244";
    NSString *ipAddress = [[NSString alloc] initWithCString:ip];

    /* Build our socket context; this ties an instance of self to the socket */
    CFSocketContext CTX = { 0, self, NULL, NULL, NULL };

    /* Create the server socket as a TCP IPv4 socket and set a callback */
    /* for calls to the socket's lower-level connect() function */  
    TCPClient = CFSocketCreate(NULL, PF_INET, SOCK_STREAM, IPPROTO_TCP,
                               kCFSocketDataCallBack, (CFSocketCallBack)DataCallBack, &CTX);

    if (TCPClient == NULL)
        return;

    /* Set the port and address we want to listen on */
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_len = sizeof(addr);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);// PORT = 5001
    addr.sin_addr.s_addr = inet_addr([ipAddress UTF8String]);

    CFDataRef connectAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr));
    CFSocketConnectToAddress(TCPClient, connectAddr, -1);
    CFRunLoopSourceRef sourceRef =
    CFSocketCreateRunLoopSource(kCFAllocatorDefault, TCPClient, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes);
    CFRelease(sourceRef);
    CFRunLoopRun();
} 
如您所见,当我创建服务器套接字时,我注册了一个回调来侦听来自服务器的传入数据

然后我使用CFRunLoopAddSource。。。和CFRunLoopRun方法使此回调在后台侦听

现在,这就是我的send方法的外观

- (void) send
{
    if (TCPClient == NULL)
        return;

    Byte byteData[3];   
    for (int i = 1; i <= 25; i++) {
        receivedLastAnswer = NO;
        globalPos = i;
        byteData[0] = i;
        byteData[1] = 4;
        byteData[2] = 0;
        int len = 3;//strlen(byte)+1;               
        CFDataRef refData = CFDataCreate(kCFAllocatorDefault, byteData, len);
        CFSocketSendData(TCPClient, NULL, refData, 0);
        while (!receivedLastAnswer) {
            //this while is to wait until a response is send by the server
         }
    }
}
我要做的是向服务器发送一个命令,您看到的3字节数组就是这个命令,并等待服务器响应,然后再发送下一个命令。为此,我使用了一段时间,变量receivedLastAnswer是一个在调用我的DataCallBack方法时设置的标志,因此如果服务器响应,就会调用回调,它将标志设置为true,因此while退出,下一个命令是send

当然,这不是我打算留下代码的方式,这只是为了测试和看看它是否有效,因为稍后我将不得不在while中添加另一个条件,一个超时条件,以防服务器根本不响应

现在,我的问题是,我的应用程序,客户端,没有启动回调方法,因此它只是无限循环;我认为不触发回调的原因是因为应用程序在while循环中很忙,事实上,如果我删除了该循环,则会触发回调,但这对我来说没有意义,因为回调方法不应该在另一个线程上运行,这不是CFRunLoopRun的目的吗?因为它运行在不同的线程中,所以主线程是否在一个循环中或者我完全误解了它是如何工作的都不重要

另外,我尝试不使用while循环,而是使用Sleep函数,但它是相同的,没有触发回调

你知道为什么会发生这种情况,或者我如何才能做到这一点


谢谢。

我认为如果主线程忙或被阻塞,我的数据回调实际上不会被调用,所以我所做的是将回调方法留在主线程上,并将发送方法放在另一个线程中,它实际上工作得很好,但我仍然在犹豫是否还有其他方法,但现在它满足了我的需要,所以我会坚持下去