在 iOS 编程中使用 while(true) 语句是一种有效的方法吗?
Using while(true) statement a valid approach in iOS programming?
在objective 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);**
}
反过来startRenewThread()函数也在里面执行dispatch_async操作。所以我必须让 renewAuth() 等待。
一旦更新成功,startRenewThread 中的异步任务将更新 bool 变量。
除了dispatch_groups,还有其他更好的方法吗?
让其他线程等待 while (true) 语句是否好?
我相信你需要的是 semaphore
比如:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
__block BOOL done = FALSE;
while (true) {
[self someCompletionMethod completion:^(BOOL success) {
if(success) { // Stop condition
done = TRUE;
}
// do something
dispatch_semaphore_signal(sem); // This will let a new iteration
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
if(done) {
dispatch_async(dispatch_get_main_queue(), ^{
// Dispatch to main
NSLog(@"Done!");
break;
});
}
}
});
Semaphores are an old-school threading concept introduced to the world by the ever-so-humble Edsger W. Dijkstra. Semaphores are a complex topic because they build upon the intricacies of operating system functions.
您可以在此处查看有关信号量的教程并查看更多链接:https://www.raywenderlich.com/63338/grand-central-dispatch-in-depth-part-2
希望对您有所帮助
马诺吉·库马尔
使用 while 循环等待布尔变量改变不是解决问题的正确方法。以下是此方法的一些问题
您的 CPU 不必要地定期检查变量。
这将清楚地表明开发人员不具备编码的基本技能和语言可用的功能。
如果出于任何原因您的变量永远不会改变,那么您的 CPU 将永远不会停止检查 while 循环中的 bool 值并阻止在同一线程上执行更多代码。
以下是一些正确的方法:
块或闭包:当 RenewAuthToken 完成时,使用块异步执行代码。
委托:如果块更难理解,请使用委托并在完成 RenewAuthToken 后触发委托。
Notifications:在 classes 中添加通知观察者,它需要在 RenewAuthToken 完成时做出响应,并从异步任务中抛出通知并让 class 捕获它执行代码.
锁:如果有必要阻塞线程的执行直到响应到来,使用锁来控制线程执行而不是使用while循环
编辑
正如 fogmeister 在评论中指出的那样
If you block the main thread for too long with a while(true) loop then
the app will actually be terminated by the iOS Watchdog as it will
assume it has crashed
请看link : understand iOS watchdog termination reasons 由fogmeister
提供
希望对您有所帮助。
你的所作所为绝对是致命的。它阻塞了 运行ning 线程(大概是主线程)所以 UI 被冻结了。它 运行 一个核心在 100% 负载下无缘无故地快速耗尽电池并加热 phone。这会给你带来一些非常非常不开心的客户或者非常非常开心的前客户。
像这样的任何事情都必须在后台 运行:startRenewThread 应该触发一些设置 RenewAuthTokenInProgress = NO 并设置是否有新令牌的操作,然后触发进一步的操作。
这是 iOS(据我所知 Android)上绝对必要的编程模式。
在objective 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);**
}
反过来startRenewThread()函数也在里面执行dispatch_async操作。所以我必须让 renewAuth() 等待。
一旦更新成功,startRenewThread 中的异步任务将更新 bool 变量。
除了dispatch_groups,还有其他更好的方法吗? 让其他线程等待 while (true) 语句是否好?
我相信你需要的是 semaphore
比如:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
__block BOOL done = FALSE;
while (true) {
[self someCompletionMethod completion:^(BOOL success) {
if(success) { // Stop condition
done = TRUE;
}
// do something
dispatch_semaphore_signal(sem); // This will let a new iteration
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
if(done) {
dispatch_async(dispatch_get_main_queue(), ^{
// Dispatch to main
NSLog(@"Done!");
break;
});
}
}
});
Semaphores are an old-school threading concept introduced to the world by the ever-so-humble Edsger W. Dijkstra. Semaphores are a complex topic because they build upon the intricacies of operating system functions.
您可以在此处查看有关信号量的教程并查看更多链接:https://www.raywenderlich.com/63338/grand-central-dispatch-in-depth-part-2
希望对您有所帮助
马诺吉·库马尔
使用 while 循环等待布尔变量改变不是解决问题的正确方法。以下是此方法的一些问题
您的 CPU 不必要地定期检查变量。
这将清楚地表明开发人员不具备编码的基本技能和语言可用的功能。
如果出于任何原因您的变量永远不会改变,那么您的 CPU 将永远不会停止检查 while 循环中的 bool 值并阻止在同一线程上执行更多代码。
以下是一些正确的方法:
块或闭包:当 RenewAuthToken 完成时,使用块异步执行代码。
委托:如果块更难理解,请使用委托并在完成 RenewAuthToken 后触发委托。
Notifications:在 classes 中添加通知观察者,它需要在 RenewAuthToken 完成时做出响应,并从异步任务中抛出通知并让 class 捕获它执行代码.
锁:如果有必要阻塞线程的执行直到响应到来,使用锁来控制线程执行而不是使用while循环
编辑
正如 fogmeister 在评论中指出的那样
If you block the main thread for too long with a while(true) loop then the app will actually be terminated by the iOS Watchdog as it will assume it has crashed
请看link : understand iOS watchdog termination reasons 由fogmeister
提供希望对您有所帮助。
你的所作所为绝对是致命的。它阻塞了 运行ning 线程(大概是主线程)所以 UI 被冻结了。它 运行 一个核心在 100% 负载下无缘无故地快速耗尽电池并加热 phone。这会给你带来一些非常非常不开心的客户或者非常非常开心的前客户。
像这样的任何事情都必须在后台 运行:startRenewThread 应该触发一些设置 RenewAuthTokenInProgress = NO 并设置是否有新令牌的操作,然后触发进一步的操作。
这是 iOS(据我所知 Android)上绝对必要的编程模式。