【问题标题】:Call Objective-C Method调用 Objective-C 方法
【发布时间】:2013-06-14 23:37:17
【问题描述】:

在延迟 0.5 秒后,我该如何调用这个方法 - (void)displayView:(UIView *)view arg:(UILabel *)label { }

我尝试过[self performSelector:@selector(displayView:) withObject:view afterDelay:.5];,但它只将 view 作为参数传递。

如何将两个参数传递给延迟为 0.5 秒的方法?

【问题讨论】:

  • 这和Xcode完全没有关系。
  • 顺便说一句,将参数包装到字典中,然后繁荣,您已经从 N args 中制作了 1 个 arg。
  • @H2CO3 很抱歉。好点子。我可以试试。谢谢。

标签: ios objective-c methods


【解决方案1】:

使用延迟块调用:

主线程:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [self displayView:view arg:label];
});

后台线程:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self displayView:view arg:label];
});

【讨论】:

  • @HenryHarris:谢谢,已修复。
  • AHHHH 我花了半个小时试图找出更新的方法来做到这一点!非常感谢!
  • iOS 的Grand Central Dispatch (GCD) Reference 中没有弃用的概念,顺便说一句。
  • @Regexident 那么这是一个文档错误。 dispatch_get_current_queue() 在标题中注解为 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6,__MAC_10_9,__IPHONE_4_0,__IPHONE_6_0)
【解决方案2】:
- (id)performSelector:(SEL)aSelector
           withObject:(id)anObject  
           withObject:(id)anotherObject

来自Apple Documentation

[self performSelector:@selector(displayView:arg:)
           withObject:myView
           withObject:myLabel];

但我真的建议你选择 GCD

另一个选项是 dispatch_after,它将在某个时间占用一个块并将其排入队列。

double delayInSeconds = 5.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

    [self displayView:myView arg:myLabel];

});

另一种方法是使用 NSTimer

myTimer = [NSTimer scheduledTimerWithTimeInterval:2.0
    target:self
    selector:@selector(displayViewWitharg:)
    userInfo:dict
    repeats:NO];

// where dict is NSDictioary with key-value pair, which contains your parameters which you want to pass.

在这里,只要您需要,您可以使此计时器无效以停止进程。

希望对你有帮助

【讨论】:

  • 我不久前尝试了dispatch_after,但在dispatch_get_main_queue(); 上遇到了弃用警告。我相信。我不知道你这样做的方式是否正确,但我可以试试。谢谢。 :)
  • 我添加了 3 个不同的示例来在单独的线程上运行进程。您可以根据自己的可行性选择其中任何一种。
  • @Mrunal performSelector:withObject:withObject 不在单独的线程中运行——它基于运行循环(有关详细信息,请参阅NSRunLoop 的文档)。此外,它没有提供指定 OP 所需的 0.5 秒延迟的方法。您的 NSTimer 示例具有误导性。 NSTimer 实例不能调用带有自定义签名的方法;签名必须是- (void)methodName:(NSTimer *)timer
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2011-05-26
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
相关资源
最近更新 更多