ios - ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet

标签 ios objective-c core-data

我刚刚接管的应用程序随机崩溃,出现“ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet”错误。

崩溃时应用程序正在尝试从核心数据中读取。它不会一直崩溃,只是随机崩溃。我不确定是导致问题的 PREDICATE 还是两个线程访问核心数据?如果它是 PREDICATE,我认为它每次都会崩溃。他们已经多次迁移到 db 结构,所以也许其中一次迁移使对象处于奇怪的状态,并且当 Core Data 获取该对象时它崩溃了?

这里是谓词调用

+(NSString *)buildCompoundContainsStringForField:(NSString *)field searchTerm:(NSString *)search operator:(NSString *)operator
{
NSArray *parts = [search componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString *partJoin = [NSString stringWithFormat:@"'%@ %@ contains[c]'", operator, field];
NSString *compoundContains = [parts componentsJoinedByString:partJoin];
NSString *predicateString = [NSString stringWithFormat:@"%@ contains[c] '%@'", field, compoundContains];
return predicateString;
}



    NSPredicate *titleSearch = [AStore searchTitlePredicate:search];
    NSPredicate *ingredientSearch = [AStore searchIngredientsPredicate:search];
    NSPredicate *recipeDecription = [AStore searchDescriptionPredicate:search];
    NSPredicate *searchMethod = [AStore searchMethodPredicate:search];


+ (NSPredicate *)searchIngredientsPredicate:(NSString *)search {
return [NSPredicate predicateWithFormat:[self buildCompoundContainsStringForField:@"ANY ingredients.desc"
                                                                       searchTerm:search
                                                                         operator:@"AND"]];
}

+ (NSPredicate *)searchTitlePredicate:(NSString *)search {
return [NSPredicate predicateWithFormat:[self buildCompoundContainsStringForField:@"ANY title"
                                                                       searchTerm:search
                                                                         operator:@"AND"]];
}

+ (NSPredicate *)searchDescriptionPredicate:(NSString *)search {
return [NSPredicate predicateWithFormat:[self buildCompoundContainsStringForField:@"ANY recipeDescription"
                                                                       searchTerm:search
                                                                         operator:@"AND"]];
}

+ (NSPredicate *)searchMethodPredicate:(NSString *)search {
return [NSPredicate predicateWithFormat:[self buildCompoundContainsStringForField:@"ANY method"
                                                                       searchTerm:search
                                                                         operator:@"AND"]];
}

=== 崩溃的方法 ======

-(void) updateDictionaryWithWeight:(int)weight usingRequest:(NSFetchRequest *)request
{
    NSError *error;
    NSArray *results = [self.context executeFetchRequest:request error:&error];  <---- CRASHES/ERRORS HERE

......

}

=== 这里是调用栈 ====

    *** First throw call stack:
    (
        0   CoreFoundation                      0x0000000103fbb495 __exceptionPreprocess + 165
        1   libobjc.A.dylib                     0x0000000103d1a99e objc_exception_throw + 43
        2   Foundation                          0x000000010351606b -[NSPredicateOperator performOperationUsingObject:andObject:] + 826
        3   Foundation                          0x0000000103515c1e -[NSComparisonPredicate evaluateWithObject:substitutionVariables:] + 314
        4   Foundation                          0x0000000103515ae2 -[NSPredicate evaluateWithObject:] + 19
        5   CoreData                            0x0000000101df40aa -[NSManagedObjectContext executeFetchRequest:error:] + 2170
        6   CoreData                            0x0000000101e3b18b -[NSManagedObjectContext(_NestedContextSupport) _parentObjectsForFetchRequest:inContext:error:] + 395
        7   CoreData                            0x0000000101ea5ed3 __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 563
        8   libdispatch.dylib                   0x00000001042ef72d _dispatch_client_callout + 8
        9   libdispatch.dylib                   0x00000001042de5d0 _dispatch_barrier_sync_f_invoke + 57
        10  CoreData                            0x0000000101e3af92 _perform + 114
        11  CoreData                            0x0000000101e3ae2d -[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:] + 301
        12  CoreData                            0x0000000101df3a21 -[NSManagedObjectContext executeFetchRequest:error:] + 497
        13  Things                             0x000000010035ff40 -[AStore updateDictionaryWithWeight:usingRequest:] + 128
        14  Things                             0x000000010035cce8 -[AStore weightedThingsWithSearchString:andFilterFlags:sortedBy:] + 920
        15  Things                             0x00000001003b87a7 -[ASearchViewController doSearchWithCompletionBlock:] + 1319
        16  Things                             0x00000001003be466 -[ASearchViewController localRefresh:] + 198
        17  Things                             0x00000001003c17e1 __59-[ASearchViewController filterControllerDidFinish:]_block_invoke + 577
        18  Things                             0x000000010059624e __72+[UIView(mfw) presentIndicatorWithLoadingTitle:successTitle:completion:]_block_invoke + 174
        19  libdispatch.dylib                   0x00000001042dc851 _dispatch_call_block_and_release + 12
        20  libdispatch.dylib                   0x00000001042ef72d _dispatch_client_callout + 8
        21  libdispatch.dylib                   0x00000001042df3fc _dispatch_main_queue_callback_4CF + 354
        22  CoreFoundation                      0x0000000104019289 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
        23  CoreFoundation                      0x0000000103f66854 __CFRunLoopRun + 1764
        24  CoreFoundation                      0x0000000103f65d83 CFRunLoopRunSpecific + 467
        25  GraphicsServices                    0x0000000104b2bf04 GSEventRunModal + 161
        26  UIKit                               0x0000000102493e33 UIApplicationMain + 1010
        27  Things                             0x0000000100002463 main + 115
        28  libdyld.dylib                       0x00000001045405fd start + 1
        29  ???                                 0x0000000000000001 0x0 + 1
    )
    libc++abi.dylib: terminating with uncaught exception of type NSException

最佳答案

问题是这里不需要 ANY 运算符。正如 Martin R 所提到的,ANY 用于对多关系。所以如果你有这样的东西:

class Recipe
{
  public String title;
}

class CookBook
{
 public Array recipes;
}

如果您想找到所有具有特定标题的食谱的食谱,那么您可以使用谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY recipes.title CONTAINS[c] %@", @"sh"];

如果您只想要与您的标题匹配的所有 Recipe 对象,则不需要 ANY 运算符。只需使用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title CONTAINS[c] %@", @"sh"];

如果您想要更深入的解释,请阅读:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Predicates.pdf

尤其要注意“在键路径中使用谓词”部分。希望对您有所帮助。

关于ios - ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24269546/

相关文章:

ios - 如何再次请求 CoreMotion 权限?

iphone - 在 objective-C (iphone) 中,如何管理 '@protocol' 引用的内存?

java - java 和 c/objective 中的服务器/客户端 - 编码问题

ios - 我怎样才能使用 Core Data 和 Swift 获取非标准(可转换)属性来更新/保存和持久化?

ios - 在 Swift 中使用给定的 IP 地址初始化一个 `sockaddr` 结构

ios - 我可以通过某种方式使 UIWebview 静音/取消静音吗?

iOS 9 等宽文本

ios - 通过示例了解何时使用 dispatch_get_main_queue 和 requiresMainQueueSetup

swift - 全部删除然后保存Core Data中的对象

ios - Swift 核心数据与 Web 服务器同步