这不是完整的翻译,因为您的某些代码似乎丢失了(请参阅我上面的评论)..但这至少会给您一个起点:
var doSomething = function (callback) {
//some work
}
在 obj-c 中,这或多或少与块相同,因此您可以编写如下内容:
void (^doSomething)(id) = ^(callback) {
// some work
}
我不会解释语法,这就是上面链接的用途。由于 javascript 是松散类型的,并且您没有指定回调的数据类型是什么.. 我将回调参数设置为id
obj-c 中的泛型,它可以代表任何类(包括块)
var start = function (interval, other, cb) {
setInterval(doSomething(function(result){
total = result + other
cb(total)
}), interval)
}
在这里,您基本上doSomething
是在结果回调上调用和应用一个任意函数,并且您每interval
毫秒进行一次调用。
在 Objective-c 中,您使用NSTimer来执行setInterval所做的事情。
NStimer 调用一个选择器(即方法).. 所以我们只需创建一个环绕我们的块的方法:
-(void)blockWrapper:(id)argument {
doSomething(argument);
}
然后我们使用该方法创建 NSTimer(请参阅下面的方法参考):
// here interval is in seconds, in your code it is in milliseconds
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:interval
target:self
selector:@SEL(blockWrapper:)
userInfo:nil
repeats:YES];
更新:
所以现在我知道 start 是什么,我们基本上这样定义它(注意:这里我使用对原始+ scheduleTimerWithTimeInterval:target:selector:userInfo:repeats:上面的修改..我从这里借用修改..基本上修改不是让 NSInterval 在选择器上运行,而是使其在块上运行。请注意,修改代码假定块没有参数。我会更改该代码并使其期望类型为void(^blockName)((void)(^otherBlockname)(void))
..
- (void)start:(int)interval other:(int)other callback:(void)((^)(int total))callback {
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:interval
repeats:YES
actions:doSomething(^(result) {
int total = result + other;
callback(total);
}
}
然后最后而不是
start(1000, 10, function(total){
console.log(total)
})
你会有:
[start:1000 other:10 callback:^(total) {
NSLog(@"%d",total);
}];
最后说明:上面的代码非常先进。我强烈建议您将每个部分都单独练习(即查看我上面引用的块文章.. 花点时间阅读它.. 块语法需要一段时间才能理解.. 它并不那么简单作为 javascript b/c 中的匿名函数,你必须对参数非常具体。同样,javascript 是一种松散类型的语言,obj-c 不是)。