是否有一种方法可以在延迟后用一个基本参数调用块,就像使用performSelector:withObject:afterDelay:但是使用int/double/float这样的参数?


当前回答

在BlocksKit框架中有一个很好的例子。

BlocksKit

(和班级)

BBlocksKit.m

其他回答

我相信作者不是在问如何等待一个分数时间(延迟),而是如何传递一个标量作为参数的选择器(withObject:)和现代objective C中最快的方法是:

[obj performSelector:...  withObject:@(0.123123123) afterDelay:10]

你的选择器必须改变它的参数为NSNumber,并使用floatValue或doubleValue这样的选择器检索值

您可以将参数包装在自己的类中,也可以将方法调用包装在不需要在基本类型中传递的方法中。然后在延迟之后调用该方法,并在该方法中执行您希望执行的选择器。

对于Swift,我已经创建了一个全局函数,没什么特别的,使用dispatch_after方法。我更喜欢这个,因为它易于阅读和使用:

func performBlock(block:() -> Void, afterDelay delay:NSTimeInterval){
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), block)
}

你可以这样使用:

performBlock({ () -> Void in
    // Perform actions
}, afterDelay: 0.3)

这里是我的2美分= 5个方法;)

我喜欢封装这些细节,让AppCode告诉我如何完成我的句子。

void dispatch_after_delay(float delayInSeconds, dispatch_queue_t queue, dispatch_block_t block) {
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, queue, block);
}

void dispatch_after_delay_on_main_queue(float delayInSeconds, dispatch_block_t block) {
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_after_delay(delayInSeconds, queue, block);
}

void dispatch_async_on_high_priority_queue(dispatch_block_t block) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), block);
}

void dispatch_async_on_background_queue(dispatch_block_t block) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), block);
}

void dispatch_async_on_main_queue(dispatch_block_t block) {
    dispatch_async(dispatch_get_main_queue(), block);
}

按Cmd + Shift + L显示Xcode内置代码片段库:

寻找分派之后,然后,只需拖放到您的代码。