使用 performSelector:withObject:afterDelay: 与非对象参数

Posted

技术标签:

【中文标题】使用 performSelector:withObject:afterDelay: 与非对象参数【英文标题】:Using performSelector:withObject:afterDelay: with non-object parameters 【发布时间】:2011-03-06 13:21:32 【问题描述】:

我想在表格视图上调用setEditing:animated: 并稍有延迟。通常,我会使用 performSelector:withObject:afterDelay: 但是

    pSwOaD 只接受一个参数 setEditing:animated: 的第二个参数是原始 BOOL - 不是对象

过去我会在自己的类中创建一个虚拟方法,例如setTableAnimated,然后调用[self performSelector:@selector(setTableAnimated) withObject:nil afterDelay:0.1f,但这对我来说感觉很笨拙。

有没有更好的方法?

【问题讨论】:

【参考方案1】:

为什么不使用 dispatch_queue ?

  double delayInSeconds = 2.0;
  dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
  dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
      [tableView setEditing …];
  );

【讨论】:

我不知道为什么这被否决了,这对我来说似乎是一个很好的解决方案。 如果您使用的是 ios4,这就是这样做的方法【参考方案2】:

你需要使用NSInvocation:

请参阅此代码,取自 answer,我已对其稍作更改以匹配您的问题:

BOOL yes = YES;
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self.tableView methodSignatureForSelector:@selector(setEditing:Animated:)]];
[inv setSelector:@selector(setEditing:Animated:)];
[inv setTarget:self.tableView];
[inv setArgument:&yes atIndex:2]; //this is the editing BOOL (0 and 1 are explained in the link above)
[inv setArgument:&yes atIndex:3]; //this is the animated BOOL
[inv performSelector:@selector(invoke) withObject:nil afterDelay:0.1f];

【讨论】:

我认为使用像 BOOL _yes = YES 这样的 var 名称会更清楚一些,因为它可以缓解您是否有错字(是与是)的一些困惑。 另外只是想指出,使用YES的变量而不是直接传递bool的原因:NSInvocation抛出异常:[NSInvocation setArgument:atIndex:]: NULL address argument,explained in this answer。跨度> 【参考方案3】:

选择器setEditing:animated:performSelector:withObject:afterDelay 不兼容。您只能调用具有 0 或 1 个参数的方法,并且参数(如果有)必须是一个对象。所以你的解决方法是要走的路。您可以将 BOOL 值包装在 NSValue 对象中并将其传递给您的 setTableAnimated 方法。

【讨论】:

【参考方案4】:

如果您能理解它,请使用 NSInvocation 抓取器来创建调用对象并延迟调用它,使用 1 行而不是多行:http://overooped.com/post/913725384/nsinvocation

【讨论】:

如果涉及创建类,几乎没有一行。

以上是关于使用 performSelector:withObject:afterDelay: 与非对象参数的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)