Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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-应用程序界面在网络呼叫期间启动时冻结_Ios_Objective C_Multithreading_Mknetworkkit - Fatal编程技术网

iOS-应用程序界面在网络呼叫期间启动时冻结

iOS-应用程序界面在网络呼叫期间启动时冻结,ios,objective-c,multithreading,mknetworkkit,Ios,Objective C,Multithreading,Mknetworkkit,我正在开发的应用程序在第一次启动时会获取大量不同的新闻源,并更新任何过期的新闻源。当这种情况发生时,界面经常冻结,你不能点击任何东西。实际的网络调用是在一个单独的线程上完成的,但是数据库操作是在主线程上完成的。这会导致接口冻结吗 有人告诉我,我需要一次只将两个要更新的提要插入网络操作队列,这样它就不会一次尝试所有提要,但它已经设置为一次只执行这么多网络调用。我不明白,如果一次队列中的东西越少,那么不管怎样,如果它们只是按顺序放在队列中,队列的速度会越快。如果我错了,请纠正我,我对这个还是很陌生的

我正在开发的应用程序在第一次启动时会获取大量不同的新闻源,并更新任何过期的新闻源。当这种情况发生时,界面经常冻结,你不能点击任何东西。实际的网络调用是在一个单独的线程上完成的,但是数据库操作是在主线程上完成的。这会导致接口冻结吗

有人告诉我,我需要一次只将两个要更新的提要插入网络操作队列,这样它就不会一次尝试所有提要,但它已经设置为一次只执行这么多网络调用。我不明白,如果一次队列中的东西越少,那么不管怎样,如果它们只是按顺序放在队列中,队列的速度会越快。如果我错了,请纠正我,我对这个还是很陌生的


任何关于在启动过程中导致UI冻结的原因的帮助都将不胜感激

将耗时的操作从主线程移开总是一个好主意

幸运的是,在iOS上做起来很简单。如果耗时的任务相当简单,你可以考虑使用<代码> PrimeStudioReStudio< /Cord>

e、 g:

但是要记住,您不能从后台线程访问GUI。要将对象返回到主线程,请使用
performselectornmainthread

e、 g:


尝试将此策略应用于数据库调用。根据您的场景,您可能希望将其包装在
NSOperation
中,或者在找到冻结原因时使用线程。

我认为cocoa touch中没有NSTask。我建议使用NSOperationQueue或gcd进行异步操作,而不是使用这些方法。@insane-36您对NSTask的看法绝对正确。我已经更新了答案。performSelectorInBackground是一种非常方便的方法,可以测试某些代码是否可以从后台运行中获益,而无需设置线程。
 [self performSelectorInBackground:@selector(myFunction:)
    withObject:myParam];
 [self performSelectorOnMainThread:@selector(myFunction:) myParamwaitUntilDone:YES];