Ios 如何在GCD中调度runloop中的事件

Ios 如何在GCD中调度runloop中的事件,ios,grand-central-dispatch,Ios,Grand Central Dispatch,我正在尝试连接到自定义GCD队列中的服务器。我就是这样做的 - (void) initNetworkCommunication{ if(!self.connQueue){ self.connQueue = dispatch_queue_create("connection_queue", NULL); } dispatch_async(self.connQueue, ^(void) { if(self.inputStream ==nil

我正在尝试连接到自定义GCD队列中的服务器。我就是这样做的

- (void) initNetworkCommunication{
    if(!self.connQueue){
        self.connQueue = dispatch_queue_create("connection_queue", NULL);
    }

    dispatch_async(self.connQueue, ^(void) {
        if(self.inputStream ==nil && self.outputStream ==nil) {
            CFReadStreamRef readStream;
            CFWriteStreamRef writeStream;
            NSString *host= [[NSUserDefaults standardUserDefaults] objectForKey:@"ip_preference"];
            NSNumber *portNum = [[NSUserDefaults standardUserDefaults] objectForKey:@"port_preference"];

            int port = [portNum intValue];
            CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);

            CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
            CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);  

            self.inputStream = (__bridge NSInputStream *)readStream;
            self.outputStream = (__bridge NSOutputStream *)writeStream;
            [self.inputStream setDelegate:self];
            [self.outputStream setDelegate:self];

            [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
            [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

            [self.outputStream open];
            [self.inputStream open];
        } else {
            NSLog(@"persistant connection alerady opened");
            return;
        }
    });
}
现在,如果我在dispatch_sync中编写这段代码,它将正确调用委托函数

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
但是,当我使用dispatch_asynch时(这是我想要做的),它不会调用我的委托函数

从我到目前为止读到的内容来看,GCD队列有一个与之相关联的runloop,但这些队列不是由系统运行的,我们需要自己运行。我在理论上理解这一点,但如何做到呢。调度与此相关的源


提前感谢。

[self.inputStream open]之后添加此方法

[[NSRunLoop currentRunLoop]run];
这使接收器进入一个永久循环,在此期间,它处理来自所有连接的输入源的数据。
请参阅apple文档,了解使用
dispatch\u async()时让运行在
dispatch\u get\u main\u队列上的另一种方式

在上面的代码中,我在哪里调用此方法?就在[self.inputStream打开]之后?对于我安排的两个事件,我是否要调用它两次?谢谢,为了回答上面的问题,run调用在dispatch\u async函数的末尾。这会使线程永远运行吗?如果是这样,这不是某种泄漏吗?是的,为了停止RunLoop,您应该调用CFRunLoopStop,或者更好的方法是设置线程的时间限制,请查看答案中添加的参考以了解更多详细信息