gpt4 book ai didi

objective-c - 在不知道名称的情况下打开现有的 Search Kit 框架搜索索引

转载 作者:行者123 更新时间:2023-12-03 17:35:30 24 4
gpt4 key购买 nike

OS X 的 Search Kit Framework允许创建和访问搜索索引。但是,当现有搜索​​索引的名称未知时,无法访问该索引。框架的所有可用于访问现有搜索索引的函数(SKIndexOpenWithData、SKIndexOpenWithMutableData、SKIndexOpenWithURL)都需要索引名称。这与存储搜索索引数据的文件的文件名不同。

当我尝试通过调用 SKIndexOpenWithURL 而不知道索引名称来访问现有搜索索引文件时,该函数不会返回有效的 SKIndexRef。传递 NULL 作为索引名称(如框架文档的建议)不起作用,因为搜索套件框架仅尝试使用索引名称“IADefaultIndex”。

举个例子,如果我创建一个索引名称如下的索引文件:

    NSString *path = @"/Users/Tim/Desktop/searchindex.skindex";
NSURL *url = [NSURL fileURLWithPath: path];
NSString *name = @"myIndex";
SKIndexType type = kSKIndexInverted;
SKIndexRef skIndex;
skIndex = SKIndexCreateWithURL ((__bridge CFURLRef)url, (__bridge CFStringRef)name, (SKIndexType)type, (CFDictionaryRef)NULL);
// ..

如果我知道索引名称“myIndex”,以后我只能打开文件并访问存储的索引。如果我尝试在没有(或不知道)索引名称的情况下打开文件,则以下代码示例将失败:

    NSURL *skURL = [NSURL fileURLWithPath:@"/Users/Tim/Desktop/searchindex.skindex"];
SKIndexRef skIndex;
skIndex = SKIndexOpenWithURL((__bridge CFURLRef)skURL, NULL, true);
if (!skIndex) NSLog (@"couldn't open index!");

但是,搜索索引的名称肯定位于该索引文件内。有人知道在不知道搜索索引名称的情况下检索该名称或以其他方式访问搜索索引文件的方法吗?我知道根据框架文档,不可能使用框架来获取该索引名称,但它仍然应该是可能的。

最佳答案

好吧,经过一番研究,我弄清楚了如何从搜索索引文件中提取索引名称:

-(NSString*)getIndexNameOfSKFile:(NSString*)filePath
{
if (!filePath) return nil;

// open the search index file
NSData *data = [NSData dataWithContentsOfFile:filePath];
if (!data) return nil;
NSUInteger dataLength = [data length];

// calculate the offset where the index name is stored
int32_t offset1, offset2;
if (dataLength<11) return nil;
[data getBytes:&offset1 range:NSMakeRange(4,4)];
[data getBytes:&offset2 range:NSMakeRange(8,4)];
int32_t offset = CFSwapInt32HostToBig(offset1)+(CFSwapInt32HostToBig(offset2)/2)+14;

// Get index name string (stored as zero-terminated string)
unichar c;
NSMutableString *indexName = [NSMutableString stringWithCapacity:0];
do {
if (dataLength<(offset+1)) return nil;
[data getBytes:&c range:NSMakeRange(offset, 2)];
if (c!=0) [indexName appendString:[NSString stringWithCharacters:&c length:1]];
offset+=2;
} while (c!=0);
return indexName;
}

这可能不适用于每个 OS X 版本,但它适用于我的 10.7。

关于objective-c - 在不知道名称的情况下打开现有的 Search Kit 框架搜索索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com