【问题标题】:call function on background thread后台线程调用函数
【发布时间】:2013-12-03 21:01:52
【问题描述】:

我是 ios 开发的新手,我正在使用 tcp 套接字做一个应用程序,并遵循了几个教程,与连接相关的一切都很好。但用户界面冻结,直到我的身份验证完成。为此使用“dispatch_queue”

-(BOOL)Connect {

       queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
       dispatch_async(queue, ^ {
            CFReadStreamRef readStream;
            CFWriteStreamRef writeStream;
            CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)IP,PORT, &readStream, &writeStream);

            inputStream = (__bridge NSInputStream *)readStream;
            outputStream =(__bridge NSOutputStream *)writeStream;

           [inputStream setDelegate:self];
           [outputStream setDelegate:self];

           [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
           [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
           [inputStream open];
           [outputStream open];
           [[NSRunLoop currentRunLoop] run];

       });

    return true;

}

在这里,连接工作正常并且没有锁定。现在我的问题是,当我在输出流上写一些东西时,什么都不发送。 通过按下按钮从另一个类我需要向服务器发送一些东西,该函数被调用但不发送任何内容,因为我认为它在另一个线程中。

-(void)Send:(NSMutableData *)_output{
   [outputStream write:[_output  bytes] maxLength:[_output length]];
 }

如果它在另一个线程中,我如何在输出流中发送一些东西?

请原谅我的拼写错误,我不太会说英语


阅读一些论坛,我发现 NSThreads 可以在它们之间传递数据:

performSelector:onThread:withObject:waitUntilDone:

但我不知道如何创建一个已经在运行的线程实例。有人可以帮助我吗?

【问题讨论】:

    标签: ios multithreading sockets grand-central-dispatch outputstream


    【解决方案1】:

    对于 NS Thread,只需将上述所有代码添加到一个函数中并像这样调用它:

    [self performSelectorOnMainThread:@selector(TcpSocketFunction) withObject:nil waitUntilDone:NO];
    

    其中TcpSocketFunction 是函数名,定义为like。

    - (void) TcpSocketFunction {
     CFReadStreamRef readStream;
                CFWriteStreamRef writeStream;
                CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)IP,PORT, &readStream, &writeStream);
    
                inputStream = (__bridge NSInputStream *)readStream;
                outputStream =(__bridge NSOutputStream *)writeStream;
    
               [inputStream setDelegate:self];
               [outputStream setDelegate:self];
    
               [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
               [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
               [inputStream open];
               [outputStream open];
               [[NSRunLoop currentRunLoop] run];
    }
    

    【讨论】:

    • 感谢您的回答。但是如果我在主线程上运行这个函数,UI 就会冻结。或者我必须在 NSThread 中使用 performSelectorOnMainThread?
    • waitUntilDone:NO 确实意味着它不是同步调用。
    • 对不起,你的回答是正确的,但这不是我的问题。我通过在使用 [outputStream hasSpaceAvailable] 发送字节之前简单地询问解决了我的问题。有了这个,如果没有空间,我会重置连接以正常工作。
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2021-10-09
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多