Ios 什么';如果通过performSelectorInBackground控制UI,会发生什么情况?

Ios 什么';如果通过performSelectorInBackground控制UI,会发生什么情况?,ios,objective-c,multithreading,user-interface,uiview,Ios,Objective C,Multithreading,User Interface,Uiview,我读了一些信息,UI界面只在主线程上更新 我需要异步更新一些ui按钮s,所以我使用performSelectorInBackground,它在模拟器和设备(iPad4)上运行良好 我担心如果我保留代码,会出现一些不需要的函数。有人能给我解释一下有关性能选择背景的详细信息吗 为什么不使用它来更新UI,为什么我的应用程序可以使用它? 不管怎样,对调试问题将不胜感激 苹果公司强烈建议不要在后台线程中更改UI 您应该使用performSelectorOnMainThread,或者向UI线程的调度队列发送

我读了一些信息,UI界面只在主线程上更新

我需要异步更新一些
ui按钮
s,所以我使用
performSelectorInBackground
,它在模拟器和设备(iPad4)上运行良好

我担心如果我保留代码,会出现一些不需要的函数。有人能给我解释一下有关性能选择背景的详细信息吗

为什么不使用它来更新UI,为什么我的应用程序可以使用它?
不管怎样,对调试问题将不胜感激

苹果公司强烈建议不要在后台线程中更改UI

您应该使用
performSelectorOnMainThread
,或者向UI线程的调度队列发送一条消息,并从那里进行UI修改

dispatch_async(dispatch_get_main_queue(), ^{
  // your code here
});

苹果强烈建议不要在后台线程中更改UI

您应该使用
performSelectorOnMainThread
,或者向UI线程的调度队列发送一条消息,并从那里进行UI修改

dispatch_async(dispatch_get_main_queue(), ^{
  // your code here
});

强烈建议不要从后台线程(例如计时器、通信等)更新UI控件等。这可能是导致有时很难识别的碰撞的原因。相反,使用这些命令可以强制在UI线程(始终是“主”线程)上执行代码


进一步阅读。

强烈建议不要从后台线程(例如计时器、通信等)更新UI控件等。这可能是导致有时很难识别的碰撞的原因。相反,使用这些命令可以强制在UI线程(始终是“主”线程)上执行代码


供进一步阅读。

performSelectorInBackground:
几乎从来都不是你想要的,几乎任何东西都是如此(当然也不是从GCD创建以来)。它会创建一个你几乎无法控制的新线程。该线程将运行与您分派给它的方法相同的时间

我所说的“小控制”的意思是,您不会返回
NSThread
对象,因此很容易意外地多次调用此方法并派生出无限数量的线程。我在几个节目中看到过这种情况

在iOS中,您几乎不应该手动创建线程。GCD和
NSOperation
几乎可以处理手动线程可以做的所有事情,但更好。您通常需要线程池,这样就不会一直旋转线程。GCD会告诉你的。您希望限制创建的线程数量,这样就不会使处理器负担过重。GCD会告诉你的。您希望能够轻松地确定后台操作的优先级。GCD也给了你这个


尽管如此,我还是不明白为什么要在后台线程上执行上述操作。几乎所有的工作都是UI更新。永远不要试图在后台线程上修改UI。这是一种未定义的行为,当它出错时,它就会非常错误。事实上,它在少数情况下起作用并不意味着什么。UIKit不是线程安全的。您只需在主线程上调用
toggleToUpperWhenSingleShift
。我看不出有任何东西会阻止你,而且上下文切换到后台线程的开销在这里真的不值得(即使它是安全的,但事实并非如此)。

performSelectorInBackground:
几乎从来都不是你想要的,几乎任何事情都是如此(当然,自从GCD创建以来也不是这样)。它会创建一个你几乎无法控制的新线程。该线程将运行与您分派给它的方法相同的时间

我所说的“小控制”的意思是,您不会返回
NSThread
对象,因此很容易意外地多次调用此方法并派生出无限数量的线程。我在几个节目中看到过这种情况

在iOS中,您几乎不应该手动创建线程。GCD和
NSOperation
几乎可以处理手动线程可以做的所有事情,但更好。您通常需要线程池,这样就不会一直旋转线程。GCD会告诉你的。您希望限制创建的线程数量,这样就不会使处理器负担过重。GCD会告诉你的。您希望能够轻松地确定后台操作的优先级。GCD也给了你这个


尽管如此,我还是不明白为什么要在后台线程上执行上述操作。几乎所有的工作都是UI更新。永远不要试图在后台线程上修改UI。这是一种未定义的行为,当它出错时,它就会非常错误。事实上,它在少数情况下起作用并不意味着什么。UIKit不是线程安全的。您只需在主线程上调用
toggleToUpperWhenSingleShift
。我看不出有任何东西会阻止您,而且上下文切换到后台线程的开销在这里真的不值得(即使它是安全的,但事实并非如此)。

我需要异步更新一些UIButton是什么意思?在UIView文档链接下方(读取线程注意事项),performSelectorInBackground与普通方法是异步的。我理解错了吗?请阅读下面的讨论<代码>性能选择背景这是一种同步方法。这意味着其中的代码将以串行方式执行。但这是另一种思路。例如,异步
NSURLConnection
使用的是异步模式。谢谢!我不理解不同的线程是异步的。我需要异步更新一些UIButton是什么意思?在UIView文档链接下方(读取线程注意事项),performSelectorInBackground与普通方法是异步的。我理解错了吗?请阅读下面的讨论<代码>性能选择背景这是一种同步方法。这意味着其中的代码将以串行方式执行。但这是另一种思路。例如,异步
NSURLConnection
使用的是异步模式。谢谢!I mis-u