- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个应用程序,用户在其中输入应用程序应重复某个操作的次数。用户输入的值被获取并用于 while 循环,该循环重复用户指定的操作次数。这个过程可能会很长,我希望有一个按钮可以让用户结束这个过程。我已将重复进程移至辅助线程 (NSThread),以便用户可以在进程运行时继续与用户界面交互。当用户按下“停止”按钮时,我无法停止重复过程。允许我的主线程与它需要停止在其中运行的 while 循环的辅助线程通信的最佳方法是什么?任何帮助将不胜感激。
谢谢,
山姆
这似乎对我不起作用......我使用@property(原子,保留)声明了两个原子NSNumbers。它们都设置为整数值 0。这是我在辅助线程中运行的方法中运行的循环:
int i = 0;
while (i < timesToRun && [numberOne intValue] == 0) {
[self doSomething];
numberOne = numberTwo;
i++;
}'
我的停止按钮调用一个方法,将 numberTwo 的整数值更改为“1”。出于某种原因,这并没有停止循环。我做错了什么吗?
编辑:谢谢大家的帮助。经过反复试验,我终于找到了解决问题的办法。我只是创建了一个 .strings 文件,该文件除了文本“NO”外都是空的。我在加载应用程序时将文本设置为“NO”。在我的新 while 循环中,我使用 NSString stringWithContentsOfFile 检查文件的值是否已更改。当我想结束循环时,我调用一个写入文件并将值更改为“YES”的方法。这是我的新循环:
NSString* path = [[NSBundle mainBundle] pathForResource:@"StopFile" ofType:@"strings"];
NSString *theString = [[NSString alloc] initWithContentsOfFile:path];
NSLog(@"TheString: %@", theString);
int i;
for (i = 0; i < timesToRunScript && theString == [NSString stringWithFormat:@"NO"]; i++) {
[scriptToRun executeAndReturnError:nil];
NSString *theString = [[NSString alloc] initWithContentsOfFile:path];
NSLog(@"string: %@", theString);
if (theString == [NSString stringWithFormat:@"Yes"]) {
break;
}
如果您发现任何可以改进的地方,请告诉我。谢谢。
最佳答案
您可以在执行 while 循环的对象上添加一个原子属性,并在循环的每次迭代中检查该属性。
使属性成为原子属性将使其成为线程安全的,这样您就可以在一个线程中更改它,并在另一个线程中读取它。
关于objective-c - 结束在辅助线程中运行的 while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7127111/
我是一名优秀的程序员,十分优秀!