gpt4 book ai didi

iphone - NSPredicate中的单词边界(\b)导致NSFetchRequest不返回任何托管对象

转载 作者:行者123 更新时间:2023-12-03 18:31:53 25 4
gpt4 key购买 nike

在iPhone上使用带有sqlite商店的Core Data。...我有一堆漫画图像实体,每个实体都有一个包含漫画的issue#的字符串,例如:image.imageTitle = @"Issue 12: Special Edition";

UI的一部分允许用户键入问题编号以跳到下一个问题。我的初始代码是sloooooooow,因为imageAtIndex:一次查询Core Data的一个对象。超过数百个问题,可能需要40秒钟以上才能通过第一个循环!

慢速代码:

 // Seek forward from the next page to the right
for (i = currentPage + 1; i < [self numberOfPages]; i++) {
iterationString = [[self imageAtIndex:i] imageTitle];
iterationNumber = [[iterationString stringByTrimmingCharactersInSet:nonDigits] intValue];

if (issueNumber == iterationNumber) {
keepLooking = NO;
break;
}
}
// If nothing was found to the right, seek forward from 0 to the current page
if (i == [self numberOfPages] && keepLooking) {
for (i = 0 ; i < currentPage; i++) {
iterationString = [[self imageAtIndex:i] imageTitle];
iterationNumber = [[iterationString stringByTrimmingCharactersInSet:nonDigits] intValue];

if (issueNumber == iterationNumber) {
keepLooking = NO;
break;
}
}
}


为了寻求更有效的解决方案,我决定尝试对Core Data进行直接查询,如下所示:

    NSString *issueNumber = @"12";
NSString *issueWithWordBoundaries = [NSString stringWithFormat:@"\\b%@\\b",issueNumber];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(groupID == %@) AND (imageTitle CONTAINS %@)", groupID, issueWithWordBoundaries];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CBImage" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

[fetchRequest setPredicate:predicate];
[fetchRequest setIncludesSubentities:NO]; // Not sure if this is needed, but just in case....

// Execute the fetch
NSError *error = nil;
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

// [fetchedImages count] == 0


Predicate Programming GuideICU regex specs之间,我认为\ b可以防止搜索12返回120、121、122等。相反,它根本不会从商店返回任何内容!

另一方面,如果我离开单词边界并搜索 stringWithFormat:@"%@",issueNumber,则会返回数十个托管对象,从12到129到412。

目前,我最好的猜测是我遇到了Core Data的 Constraints and Limitations之一。如果没有,我在做什么错?如果是这样,是否有既可提供完全匹配又可提供单次提取速度的解决方法?

最佳答案

\b表示退格字符。尝试

[NSString stringWithFormat:@"\\b%@\\b",issueNumber];
// ^^ ^^


要执行RegEx匹配,请使用MATCHES,而不要包含。

关于iphone - NSPredicate中的单词边界(\b)导致NSFetchRequest不返回任何托管对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2863889/

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