2011-09-30 45 views
2

我有一个很大的plist文件,我有一个问题,当我做:加载一个大的plist文件

[NSMutableDictionary dictionaryWithContentsOfFile:docDirPath]; 

我必须等待几秒钟之前,我可以使用该应用程序。有一些解决方案吗?

谢谢

+2

将其加载到后台线程中,因此它不会阻止UI – Eimantas

+0

有同样的问题,所以我最终将PLIST拆分为多个逻辑文件,并加载为需要。我正在考虑使用CoreData进行重新分解。 –

+0

谢谢Eimantas我正在尝试它! – Andrea

回答

2

加载plist在另一个线程,GCD是完美的。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ [self.theDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:docDirPath]; }); 

如果在plist读取完成之前这样做的方法的类将不会生存,则需要将该块复制到Heap中。

dispatch_async(queue, [[^{ [self.theDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:docDirPath]; } copy] autorelease]); 
+0

我有这个警告:实例方法dictionarywithcontenentoffile:找不到 – Andrea

+1

我复制了你的电话只是为了显示使用GCD。只需将您在其他地方使用的代码封装起来即可。 – zaph

2

如果将plist存储为文本plist,请将其转换为二进制plist。它们的加载速度更快。

做到这一点的最简单的方法是用plutil:

plutil -convert binary1 file.plist

(假设它是一个静态的plist文件,而不是一个建立在-the-在您的应用程序中,您可以使用NSPropertyListSerialization将二进制字典存储为二进制文件)