首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >块而不是performSelector:withObject:afterDelay:

块而不是performSelector:withObject:afterDelay:
EN

Stack Overflow用户
提问于 2010-10-24 11:20:37
回答 6查看 39.2K关注 0票数 88

我经常想在未来几个微秒内执行一些代码。现在,我这样解决它:

代码语言:javascript
复制
- (void)someMethod
{
    // some code
}

还有这个:

代码语言:javascript
复制
[self performSelector:@selector(someMethod) withObject:nil afterDelay:0.1];

它是有效的,但我每次都必须创建一个新方法。有没有可能使用块来代替这个?基本上,我正在寻找一种方法,比如:

代码语言:javascript
复制
[self performBlock:^{
    // some code
} afterDelay:0.1];

这对我来说真的很有用。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-24 11:38:23

没有内置的方法可以做到这一点,但通过一个类别添加也不是太糟糕:

代码语言:javascript
复制
@implementation NSObject (PerformBlockAfterDelay)

- (void)performBlock:(void (^)(void))block 
          afterDelay:(NSTimeInterval)delay 
{
    block = [[block copy] autorelease];
    [self performSelector:@selector(fireBlockAfterDelay:) 
               withObject:block 
               afterDelay:delay];
}

- (void)fireBlockAfterDelay:(void (^)(void))block {
    block();
}

@end

基本实现归功于Mike Ash

票数 107
EN

Stack Overflow用户

发布于 2011-01-21 00:01:25

下面是我正在使用的一个基于GCD的简单技术:

代码语言:javascript
复制
void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void))
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay),
      dispatch_get_current_queue(), block);
}

我不是GCD专家,我对这个解决方案很感兴趣。

票数 41
EN

Stack Overflow用户

发布于 2011-11-27 07:19:28

另一种方式(由于许多原因,这可能是最糟糕的方式)是:

代码语言:javascript
复制
[UIView animateWithDuration:0.0 delay:5.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
} completion:^(BOOL finished) {
    //do stuff here
}];
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4007023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档