Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios performSelectorInBackground有权访问UI_Ios_Multithreading - Fatal编程技术网

Ios performSelectorInBackground有权访问UI

Ios performSelectorInBackground有权访问UI,ios,multithreading,Ios,Multithreading,我有一个iOS应用程序。它检查主线程中的网络连接。有时,它会阻塞。因此,我拿出一个子线程来执行新代码中的网络检查。有趣的是,子线程能够弹出一个警报窗口。我以为所有的UI都是由主线程控制的。有什么想法吗 旧代码: 新代码: 我知道performSelectorInBackground是一种古老的方式。只要试着理解为什么它仍然拥有对UI的控制,而UI应该属于主线程?可能会引起麻烦的只是糟糕的代码。编译器不知道代码可以从后台线程进行UI调用,因此它很乐意编译代码。解决方案是在主线程上调用UI 实际上,

我有一个iOS应用程序。它检查主线程中的网络连接。有时,它会阻塞。因此,我拿出一个子线程来执行新代码中的网络检查。有趣的是,子线程能够弹出一个警报窗口。我以为所有的UI都是由主线程控制的。有什么想法吗

旧代码:

新代码:


我知道performSelectorInBackground是一种古老的方式。只要试着理解为什么它仍然拥有对UI的控制,而UI应该属于主线程?

可能会引起麻烦的只是糟糕的代码。编译器不知道代码可以从后台线程进行UI调用,因此它很乐意编译代码。解决方案是在主线程上调用UI

实际上,从后台线程调用UI线程是一种糟糕的做法。但令人惊讶的是,在大多数情况下,这是完全可以接受的。我知道这很糟糕。我只是很惊讶iOS甚至允许这样做。是的,iOS允许这样做,但不是以线程安全的方式。由于涉及GCD,UIKit必须在主线程和队列上运行。从后台线程调用UIKit有一个未定义的行为,这意味着如果另一个线程在同一时间使用UIKit的同一内存块,它可能会对正在运行的应用程序造成任何不良影响。这不仅仅是编译器。代码也被执行了。至少在XCode中。
Reachability *m_checkReachability=[Reachability reachabilityWithHostName:@"www.xxx.edu"]; 
[self performSelectorInBackground:@selector(checkConnectivity) withObject:nil]; 

(void)checkConnectivity{ 
    Reachability *m_checkReachability=[Reachability  reachabilityWithHostName:@"www.xxx.edu"]; 

if (![m_checkReachability isReachable]) 
{
    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Error" message:@"Network is not availabe. Do you want to close the app?" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 

    [alert show]; 
}