【问题标题】:Writing a method inside the selector?在选择器中编写方法?
【发布时间】:2013-03-20 02:28:10
【问题描述】:

这可能很疯狂,但我想知道我们是否可以在选择器中编写实际方法。原因是,我的方法只有一个简单的 1-liner。

-(void)doThat {
    loadedPhoto.alpha = 1.0;
}

-(IBAction)revealPickers:(id)sender {

    loadedPhoto.alpha = 0.7;
    [self performSelector:@selector(doThat) withObject:nil afterDelay:1.0];
}

所以我想知道有没有这样的捷径(显然这行不通):

[self performSelector:@selector(^(void){loadedPhoto.alpha=1.0;}) withObject:nil afterDelay:1.0];

可能还是只是愚蠢?

【问题讨论】:

  • dispatch_async( dispatch_get_main_queue(), ^(void){loadedPhoto.alpha = 1.0}); 呢?
  • 你可以使用class_addMethodsimp_implementationWithBlock

标签: ios objective-c xcode methods performselector


【解决方案1】:

最简单的解决方案是使用dispatch_after,但您也可以使用块适配器在NSObject 上定义方法。

@interface BlockAdapter

@property (nonatomic, copy, readwrite) void (^block)();

- (void)call;

@end

@implementation BlockAdapter

- (void)call {
    self.block();
}

@end
@interface NSObject (PerformBlocks)

- (void)performBlock:((void)^())block afterDelay:(NSTimeInterval)delay;

@end

@implementation NSObject (PerformBlocks)

- (void)performBlock:((void)^())block afterDelay:(NSTimeInterval)delay {
   BlockAdapter* adapter = [[BlockAdapter alloc] init];
   adapter.block = block;

   [adapter performSelector:@selector(call) withObject:nil afterDelay:delay];
}

@end

【讨论】:

  • "最简单的解决方案是使用 dispatch_after" 假设代码在调度队列中运行
  • @newacct 最常见的情况是在主线程中运行代码,那么dispatch_after是最直接的解决方案。
【解决方案2】:

扩展并更正我的评论:

我的评论有误,我误读了你的代码,以为你在做[self performSelectorOnMainThread:etc:]

我的实际解决方案(在快速搜索后 - 并不难找到):

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_current_queue(), ^(void){
    loadedPhoto.alpha = 1.0;
});

希望对你有帮助!

【讨论】:

  • 轰隆隆!这完美地工作。感谢其他人的 cmets,但 Imma 将投票作为答案。谢谢大家!
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
相关资源
最近更新 更多