作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道实现莫尔斯电码生成器的最佳方法是什么。它的工作方式是用户输入一个单词或短语,然后 NSString 将作为参数传递到我的方法中进行处理。我想要处理的方式是循环遍历字符串中的每个字符,然后播放正确的音调序列。我已经在一个单独的类中实现了该机制。
我已经尝试了很多不同的方法,但它们似乎都会引入某种问题。到目前为止我尝试过的事情是:创建一个 NS 计时器,使用延迟方法调用(performSelector:withObject:afterDelay)。
下面是我用来延迟的方法的示例,但问题是,如果用户输入“aaaa”,则只有第一个“a”会播放,因为整个循环将在莫尔斯电码之前完成序列甚至完成生成。如果循环能够等待 switch case 完成后再继续,那就更理想了。
无论如何,这是我认为应该实现的方式,但它似乎不起作用,所以也许有更好的方法来实现莫尔斯电码生成器,或者我只是错过了一个步骤,所以如果有人可以的话请帮我解决这个问题,我将非常感激。
- (NSString *)convertTextToMorse:(NSString *)phrase {
for (int i = 0; i < [phrase length]; i++) {
unichar ch;
ch = [phrase characterAtIndex:i];
NSLog(@"Processing charachter %c",ch);
//Dot = 100ms
//Dash = 300ms
//Pause = 200ms
switch (ch) {
case 'a':
//Morse "a"
[self playDotSound];
[self performSelector:@selector(playDashSound) withObject:nil afterDelay:0.2];
break;
case 'b':
//Morse "b"
break;
default:
break;
}
}
return phrase;
}
最佳答案
另一种选择可能是在单独的线程上运行整个事情:
- (NSString *) convertTextToMorse:(NSString *)phrase {
[self performSelectorInBackground:@selector(morseInternal:) withObject:phrase];
return phrase;
}
- (NSString *) morseInternal:(NSString *)phrase {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
for (int i = 0; i < [phrase length]; i++) {
if (stopMorse) {
break;
}
unichar ch = [phrase characterAtIndex:i];
NSLog(@"Processing charachter %c",ch);
switch (ch) {
case 'a':
[self playDotSound];
[self pause];
[self playDashSound];
break;
case 'b':
//Morse "b"
break;
default:
break;
}
}
[pool release];
}
- (void) pause {
[NSThread sleepForTimeInterval:0.2];
}
注意,我添加了一个 stopMorse
bool 实例变量,如果您想在字符串中间停止莫尔斯电码生成,可以将其设置为 true。
关于iphone - 我如何/将实现莫尔斯电码生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4063769/
我是一名优秀的程序员,十分优秀!