Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于无限while循环,IOS应用程序无法渲染_Ios_C_Server - Fatal编程技术网

由于无限while循环,IOS应用程序无法渲染

由于无限while循环,IOS应用程序无法渲染,ios,c,server,Ios,C,Server,您好,我正在为纯用c编写的ios实现一个基本的echo服务器。当我进入无限while循环以接受传入的连接时,问题就出现了。哪里是放置accept循环的最佳位置,而无限while循环(在我的例子中,我想要的)是最佳实现 这里是流程 在应用程序委托内的应用程序函数内设置根控制器。 在控制器内调用启动服务器功能。(此函数永远不会返回) 您的方法至少有两个问题。首先,您不应该在主线程上运行无限循环,因为该线程已经用于主运行循环。使用自己的无限循环(无论在何处)阻塞此循环将中断事件处理。这就是为什么应用程

您好,我正在为纯用c编写的ios实现一个基本的echo服务器。当我进入无限while循环以接受传入的连接时,问题就出现了。哪里是放置accept循环的最佳位置,而无限while循环(在我的例子中,我想要的)是最佳实现

这里是流程 在应用程序委托内的应用程序函数内设置根控制器。 在控制器内调用启动服务器功能。(此函数永远不会返回)


您的方法至少有两个问题。首先,您不应该在主线程上运行无限循环,因为该线程已经用于主运行循环。使用自己的无限循环(无论在何处)阻塞此循环将中断事件处理。这就是为什么应用程序不呈现的原因。文件规定:

长任务(或潜在的长任务)应始终在后台线程上执行。任何涉及网络访问、文件访问或大量数据处理的任务都应该使用GCD或操作对象异步执行

但是,iOS确实允许您使用POSIX接口创建线程,例如,它提供了
pthread\u create
和friends。您应该能够在这样的线程中运行代码,而不会阻塞您的应用程序


其次,(但您可能不太感兴趣)使用POSIX网络API在某种程度上(由于这些API无法打开无线电)有利于其他接口。您最喜欢的可能是(也是一个C接口)。

这似乎是一个非常不寻常的应用程序。当然,在主线程中运行无限循环不是一个好主意。您可以尝试为此创建一个单独的线程。unix环境中的示例通常在单个线程上实现,因此我相信有一种方法可以在单个线程上实现它。我认为我的问题更多的是在应用程序生命周期的上下文中放置循环的位置。我正在写一个更详细的答案。
while(true)
{
    @autoreleasepool
    {
        int exchangeSocket = accept(socket, NULL,NULL);
        if(recv(exchangeSocket, buffer, sizeof(buffer), 0) == -1)
        {
            NSLog(@"%@", @"Error");
        }
        else
        {
            //do something with data received
        }
    }
}