2012-10-13 22 views
21

在Android中有几种方法可以从其他那些运行在主线程中的一些代码调用它的代码:如何运行在UI线程与其他那些

1. Activity.runOnUiThread(Runnable r) 
2. new Handler.post(Runnable r); 
3. View.post 

什么是iOS上的类似物?

dispatch_async(dispatch_get_main_queue(), ^{ 

    }); 

还有别的吗?

在此先感谢。

+1

所有代码都在主线程中运行,除非您另行说明。 – jrturton

+0

感谢您指出,我编辑了这个问题。 – pvllnspk

回答

36

的首选方法时下正在使用GCD,与你在你的问题引用代码:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // Your code to run on the main queue/thread 
}); 

如果您更喜欢使用比GCD更面向对象的方法,你也可以使用一个NSOperation(像NSBlockOperation)并将其添加到[NSOperationQueue mainQueue]

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    // Your code to run on the main queue/thread 
}]; 

这确实相当同样的事情dispatch_async(dispatch_get_main_queue(), …),具有被多个目标C/POO取向应使普通的C GCD功能的优点,但是具有需要用于创建NSOperation对象分配存储器的缺点,而你可以用简单的C和GCD来避免它。


我建议使用GCD,但也有其他的方法,比如那两个,让你可以从主线程给定对象上调用一个选择器(方法):

  • - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait(方法NSObject的,因此它可以在任何对象上调用)
  • [NSRunLoop mainRunLoop]

但那些SOLUT发送- (void)performSelector:(SEL)aSelector target:(id)target argument:(id)anArgument order:(NSUInteger)order modes:(NSArray *)modes离子的灵活性不如GCD或GCD,因为它们只允许您调用现有的方法(因此您的对象必须有一个已经存在的方法并执行您想要执行的操作),而GCD或-[NSOperationQueue addOperationWithBlock:]允许您将任意代码(使用块)。

+0

AliSoftware,非常感谢 – pvllnspk

+1

请注意,不是'[NSOperationQueue mainQueue]',你可以简单地写'NSOperationQueue.mainQueue'。 –

相关问题