ios - IOS/Objective-C:在 Objective-C 中可能没有处理程序的 NSTimer?
问题描述
我正在尝试将一些在 Timer 上使用的 Swift 翻译成 Objective -C 来输入新闻自动收录器效果的单词。
在 Swift 中,您可以执行以下操作:
func type(string: String) {
var wordArray = ["Sox Win", "Verlander To Start", "Race Tightens"] // an array of strings
var wordIndex = 0
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
self.textview.text.append(wordsArray[wordIndex])
wordIndex += 1
if wordIndex == wordArray.count {
timer.invalidate()
}
}
}
}
但是,在 Objective-C 中,您通常会看到:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 1.0
target: self
selector:@selector(update:)
userInfo: nil repeats:YES];
-(void) update:(NSTimer*)timer
{
int i=0;i<4;i++ {
NSLog(@"another second");
}
timer.invalidate;
timer = nil;
}
使用处理程序,我无法弄清楚如何迭代数组中的单词而不反复创建显然不起作用的数组。
- (void)updateView:(NSTimer *)timer
{
NSArray*items =@[@"item1", @"item2", @"item3", @"item4", @"item5"];
for(int i=0;i<[items count];i++){
self.textView.text = [self.textView.text stringByAppendingString:items[i]];
if (i == [items count]) {
[self.timer invalidate];
self.timer = nil;
}
}
}
我应该对 userInfo 做些什么,还是如何利用时间一次更新一个单词?在此先感谢您的任何建议。
解决方案
Objective-C 支持相同的基于块的NSTimer
方法。您的 Swift 方法的翻译将是:
- (void)type:(NSString *)string {
NSArray *wordArray = @[ @"Sox Win", @"Verlander To Start", @"Race Tightens" ];
__block NSInteger wordIndex = 0;
[NSTimer scheduledTimerWithTimeInterval:0.1 repeats:YES block:^(NSTimer * _Nonnull timer) {
// append wordsArray[wordIndex]
wordIndex += 1;
if (wordIndex == wordArray.count) {
[timer invalidate];
}
}];
}
如果出于某种原因您真的想使用基于选择器的计时器,则需要将数组和索引存储在实例变量中。但这就是使用这个基于块的解决方案的重点——您可以避免所有额外的工作和额外的方法(对于选择器)。
另一种方法是使用dispatch_after
:
- (void)type:(NSString *)string {
NSArray *wordArray = @[ @"Sox Win", @"Verlander To Start", @"Race Tightens" ];
for (NSInteger i = 0; i < wordArray.count; i++) {
dispatch_after(i + 0.1, dispatch_get_main_queue(), ^{
// append wordsArray[i]
});
}
}
不需要计时器。
推荐阅读
- jquery - 更改“data-image”属性的值
- reactjs - 在 React JSX 字符串中嵌套变量
- mysql - mysqldump 兼容模式 postgresql 不工作
- python - 如何替换 python 字符串中的对象?
- java - 如何仅为已注册的映射(端点)添加弹簧拦截器
- java - 如何从下拉列表中选择一个字符串,并传递它包含字符串数组的对象?
- python - 编码分类变量:TypeError:'str'和'float'的实例之间不支持'<'
- ng-bootstrap - ng-bootstrap timepicker 显示格式为 hh:mm a?
- python - 列表中的短语匹配
- docker - Docker容器的启动(启动)过程是什么?