我正在处理的应用程序在首次启动时会获取大量不同的新闻源并更新任何已过期的新闻源。当发生这种情况时,界面经常冻结,你不能点击任何东西。实际的网络调用是在一个单独的线程上完成的,但数据库操作是在主线程上完成的。这会导致界面冻结吗?
有人告诉我,我需要一次只将两个要更新的订阅源插入到网络操作队列中,以便它不会一次尝试所有这些,但它已经设置为仅一次做很多网络电话。我不明白如果一次排队的东西少,如果他们只是按顺序放在那里就会变得更快。如果我错了,请纠正我,我对此仍然很陌生。
任何有关可能导致UI在启动过程中冻结的问题的帮助都会非常感激!
答案 0 :(得分:1)
将耗时的操作从主线程移开是一个好主意。
幸运的是,在iOS上做起来非常简单。如果耗时的任务非常简单,您可以考虑使用performSelectorInBackground
e.g:
[self performSelectorInBackground:@selector(myFunction:)
withObject:myParam];
remberber重要的是,您不能从后台线程访问GUI。要将对象返回到主线程,请使用performSelectorOnMainThread
e.g:
[self performSelectorOnMainThread:@selector(myFunction:) myParamwaitUntilDone:YES];
尝试将此策略应用于数据库调用。根据您的情况,您可能希望将其包装在NSOperation
中,或者在找到冻结原因时使用线程。