我曾与iOS合作,但我没有得到这些所有方法之间有什么区别,
我应使用哪种语法来调用 MehodName ?
(1) [self MehodName];
(2) [self performSelector:@selector(MehodName) withObject:nil];
(3) [self performSelectorInBackground:@selector(MehodName) withObject:nil];
(4) [self performSelectorOnMainThread:@selector(MehodName) withObject:nil waitUntilDone:YES];
(5) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
[self MehodName];
});
(6) dispatch_sync(dispatch_get_main_queue(), ^{
[self MehodName];
});
请提前帮助并致谢。
答案 0 :(得分:9)
根据您的要求,所有方式都是正确的方法
(1)在当前执行代码的线程所在的同一线程上执行该方法。 (可能是后台线程或主线程)。
(2)1和2非常相似,但(2)的优势在于您可以动态确定在运行时调用哪个选择器。
(3)与[NSThread detachNewThread]相同,它创建一个新线程(表示未在主线程上执行的选择器) 通常用于webService图像提取等。
(4)在主线程上执行选择器(通常用于执行UI更改) 如果在此线程上执行的方法太长或太重,则会挂起该应用程序的持续时间,因为该方法是按优先级执行的
(5)dispatch async用于执行可以异步完成的任务,在你的情况下使用(全局队列是并发队列)(在当前情况下不在主线程上执行)(如重数据库插入)背景图像fetch,那些让你在完成后回调的方法
(6)dispatch sync同步执行该方法(在主线程的情况下)(通常用于登录操作,验证等)。
答案 1 :(得分:3)
基本上#1和#2是相同的。在正常情况下使用#1。
第3项和第5项基本相同。 #5使用GCD并且更灵活。使用这些来确保在后台线程上调用代码。
第4项和第6项基本相同。同样,#6使用GCD并且更灵活。从后台线程上的代码中使用这些代码来在主线程上运行该方法。这通常在要调用的代码与UI相关时完成。
答案 2 :(得分:0)
上面提到的所有方法都有自己的用例。我们不能说任何人都比其他人更好。
(1) - 您调用的方法将在主线程中执行。请不要在此方法中执行长时间运行的代码。
(2) - 这将使您可以灵活地在运行时选择方法名称。您将方法名称作为SEL对象传递,可以在运行时确定。您可以从NSString对象构建有效的方法名称。使用此类型时传递参数存在限制,此方法调用最多只能传递2个参数。您只能将NSObject作为参数传递。
(3) - 方法将在新创建的线程中执行。由于新创建的是独立于主线程的,因此您可以在此方法中运行长时间运行的作业,而不会影响UI线程。由于编译器将为执行方法创建按需线程,因此这种方法不适用于后台线程。
(4) - 这与#1方法调用相同。使用此方法的方法调用将在主线程中执行。但是您可以使用此方法从后台线程更新UI元素。如果要在后台线程中的主线程中执行方法,可以使用此方法。
(5) - 在Cocoa中调用方法的GCD方法。在#5 appraoch中,您的方法将在一个全局队列(一个应用程序的4个全局队列)中排队。全局队列中的所有作业将按顺序完成其执行。您可以使用#5而不是#3,因为GCD将自己处理它的线程,开发人员不会关注线程处理。
(6) - 这也是一种GCD方法,用于从后台GCD线程执行主线程中的方法。如果编译器位于后台GCD队列中,则可以使用此方法在主线程中执行作业。
希望每件事情都清楚......