我正在编写一个iPad应用程序,并且在ui响应性/锁定方面有问题。
我有一个带有项目的UITableView,当单击一个项目时,它会在互联网上退出并获取该项目并显示它。程序的其余部分(未显示)将使用下载的项目,因此一次只能下载一个项目。
抓取物品可能需要很长时间。在此期间,我希望用户仍然能够滚动UITableView,但在下载上一项之前不能选择任何内容。
我知道这可以使用线程、块和回调来完成,但是现在我没有时间去做(不可能的时间限制)。
我认为一个快速的方法是按顺序下载它,并使用运行循环和一个类似于这两个步骤的标志:
这允许用户在time.
-downloadItem(.){ BOOL downloading=TRUE;callFunctionsToStartdownload(.);//同时(下载){downloading=DownloadSomeBytes(.);CFRunLoopRunInMode(kCFRunLoopDefaultMode,0.5,是);}
(1)和(2)的结果是用户仍然可以在顺序下载期间滚动UITableView,alreadyInHere标志阻止他们选择某些内容并开始另一次下载。
在大多数情况下,这是可行的,但在下载过程中,大约有50%的情况下,UITableView会变得没有响应(不能滚动到表中的其他项),即使在您单击使theUITableView基本上被锁定的东西时,也不会再次调用下载didSelectRowAtIndexPath。
我的问题是,我做的runLoop正确吗?
我知道有其他方法可以做到,但由于其他原因,我现在必须使用这个通用的方法。
谢谢
发布于 2011-12-14 22:40:32
您不应该尝试在youR tableview didSelectRow方法中下载或执行任何其他可能长时间的活动。在设置异步下载之后,退出(返回)此UI方法,这样您就不会锁定UI。
同时关闭下载仍然是可以的,但您需要小心在错误或超时之后重置状态。
https://stackoverflow.com/questions/8511492
复制相似问题