从.plist中提取信息而不加载整个文件?

时间:2016-04-19 13:49:19

标签: objective-c deserialization plist darwin

我正在编写一个基于蓝牙的应用程序,其中包含OS X和iOS中的组件。我希望能够在发现时显示设备制造商的名称。 Bluetooth SIG分配的号码页面指定了819个供应商名称,每个名称与唯一的32位标识符相关联。

为了节省RAM,我认为不是将所有这些键值对编译到我的可执行文件中,而是在我的包中使用plist文件。这样,我想,这个大字典会安静地驻留在磁盘而不是内存中。我认为我可以在需要时提取数据并减少占用空间。

问题是我已经意识到仅这种方法会损害性能。除了正常的调用方式外,我发现无法访问plist中的信息

eVinogradarstvo.controller('ModalSpremiSredstvoCtrl', function ($scope, ModalService, SredstvaService, CommonService, data) {

function getMjerneJedinice() {
    CommonService.getMjerneJedinice()
        .success(function (mjerneJedinice) {
            $scope.MjerneJedinice = mjerneJedinice;
            $scope.sredstvo = data.sredstvo;
        })
        .error(function (error) {
            $scope.status = 'Greška kod dohvata mjernih jedinica ' + error.message;

        });
}
getMjerneJedinice();

$scope.sredstvaGrid = data.sredstvaGrid;
$scope.Ok = function () {
    SredstvaService.SpremiSredstvo($scope);
    ModalService.Cancel();
};

$scope.Cancel = function () {
    ModalService.Cancel();
};
});

每次需要文件中的任何信息时都会遇到将整个文件读入一个巨大的字典对象的麻烦。

我真正要问的是如何在不反序列化整个文件的情况下从plist中提取单个键值对?

2 个答案:

答案 0 :(得分:0)

为了能够在不加载整个文件的情况下检索特定数据,它存储在需要的信息中,需要存储数据的确切位置,例如偏移量和长度......所以最终得到另一个文件,并且一些方面类似于索引文件,这也是数据库通常具有的。所以也许数据库会有序。

CoreData在许多情况下绝对有意义,因为它旨在用于您的应用程序的本地数据存储。它经过优化可以最大限度地减少内存使用,并且在大多数情况下都很快。

当然,根据您的具体情况有意义取决于您拥有多少数据。也许将事物分成多个plist是一个更好的主意。

答案 1 :(得分:0)

您可以使用NSXMLParser以事件驱动的方式解析XML文档。因此,您必须跟踪状态,以便知道何时收到了您要查找的元素/属性。

那就是说我认为你不会获得你所瞄准的好处。如果您要查找的元素位于文件顶部附近,您将获得相当快的数据,但如果它是文档中的最后一项,那么您仍然会等到整个文件已经存在读。此外,您需要多少次查找另一个项目?如果它不止一次,那么您最终会再次重新扫描该文件,并再次否定任何短期收益。

我建议将CoreData用于需要以高效庄园检索索引数据的任务。