【问题标题】:How can I call an Objective-c static method asynchronously?如何异步调用 Objective-c 静态方法?
【发布时间】:2011-04-18 14:47:03
【问题描述】:

如何异步调用静态方法?

+ (void) readDataFromServerAndStoreToDatabase
{
     //do stuff here
     //might take up to 10 seconds
}

【问题讨论】:

  • 没有静态方法。这是发送到类的类方法的示例,而不是实例。请注意它仍然是如何发送到某物的。这应该给你一个线索如何做你想做的事(或阅读 mipadi 的答案)。

标签: objective-c asynchronous static-methods


【解决方案1】:

使用NSThread

[NSThread detachNewThreadSelector:@selector(readDataFromServerAndStoreToDatabase)
                         toTarget:[MyClass class]
                       withObject:nil];

【讨论】:

  • 不知道为什么这被否决了。它简洁而直接地回答了这个问题。
【解决方案2】:

您可以对类对象使用this method。假设你有

@interface MyClass:NSObject{
....
}
+ (void) readAndStoreDataToDatabase;
@end

然后做

NSThread*thread=[NSThread detachNewThreadSelector:@selector(readAndStoreDataToDatabase)
                                           target:[MyClass class]
                                       withObject:nil ];

请注意,继承自NSObject 的类的类对象是NSObject,因此您可以将其传递给这些方法。通过运行此程序自行查看:

#import <Foundation/Foundation.h>

int main(){
    NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init];
    NSString* foo=@"foo";
    if([foo isKindOfClass:[NSObject class]]){
        NSLog(@"%@",@"YES");
    }else{
        NSLog(@"%@",@"NO");     
    }
    if([[NSString class] isKindOfClass:[NSObject class]]){
        NSLog(@"%@",@"YES");
    }else{
        NSLog(@"%@",@"NO");     
    }
    [pool drain];
}

重点是,在 Objective-C 中,类方法(在 C++ 中称为静态方法)只是发送给类对象的标准方法。有关类对象的更多信息,请参阅 HamsterCocoa with Love 的这些精彩博文。

【讨论】:

  • 正确,但我敢打赌提问者不知道他们刚刚拿到了多少绳子。 ;)
  • 是的,我之前做过很多线程,只是不知道可以通过线程调用静态方法,所以这里的关键字是[MyClass class]
  • Objective-C 中没有 static 方法这样的东西 :) 它们是 class methods,它们被发送到类对象 dynamically。一旦你明白了,你就可以做到这一点是很自然的。
【解决方案3】:

有几种方法可以在 Objective-C 中实现并发,具体取决于您运行的环境。pthreads、NSThreads、NSOperations、GCD 和块都有它们的位置。您应该阅读 Apple 的“并发编程指南”,了解您所针对的任何平台。

【讨论】:

  • +1 用于提及广泛的选项选择和相关指南
猜你喜欢
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 2014-04-24
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多