在iOS编程中使用while(true)语句是一种有效的方法吗?

Man*_*mar 1 iphone objective-c objective-c-2.0 ios

在目标C中,我正在使我的程序等待使用while循环

doInitialize()
{
 dispach_group_t loadDataGroup=dispatch_group_create();
 dispatch_group_async(loadDataGroup,...get_global_queue(..),0),^{
   renewauth();
 }
 dispatch_group_notify(loadDataGroup,...get_global_queue(..),0),^{
   //Do other tasks once renew session has completed...
 }
}
renewauth()
{
 RenewAuthTokenInProgress=true;
 startRenewThread();
 **while (RenewAuthTokenInProgress);**
}
Run Code Online (Sandbox Code Playgroud)

反过来startRenewThread()函数也在里面执行dispatch_async操作.所以我必须让renewAuth()等一下.

一旦更新成功,startRenewThread中的异步任务将更新bool变量.

除了dispatch_groups之外,还有更好的方法吗?让其他线程等待while(true)语句是否好?

San*_*ari 6

Manoj Kumar,

使用while循环等待,直到布尔变量更改不是解决问题的正确方法.以下是此方法的一些问题

  1. 您的CPU不一定要经常检查变量.

  2. 这将清楚地表明,开发人员没有太多的编码基本技能和语言功能.

  3. 如果由于任何原因你的变量永远不会改变,那么你的CPU将永远不会停止在while循环中检查bool的值并阻止在同一个线程上执行更多代码.

以下是一些正确的方法:

  1. 块或闭包:在RenewAuthToken完成时,使用块来异步执行代码.

  2. 代表:如果块难以理解,请使用委托并在完成RenewAuthToken后触发委托.

  3. 通知:在RenewAuthToken完成时需要响应的类中添加通知的观察者,并从asynctask中抛出通知并让类捕获它来执行代码.

  4. 锁:如果有必要阻止线程的执行,直到响应到来,使用锁来控制线程执行而不是使用while循环

编辑

正如fogmeister在评论中指出的那样

如果你用一个while(true)循环阻塞主线程太长时间,iOS应用程序实际上会终止app,因为它会认为它已经崩溃了

请查看链接:了解 fogmeister提供的iOS看门狗终止原因

希望能帮助到你.

  • 还有一点需要注意.如果使用`while(true)`循环阻塞主线程太长时间,那么iOS看门狗实际上会终止应用,因为它会认为它已经崩溃了. (3认同)