2014-06-17 12 views
6

L'app che ho appena acquisito si blocca in modo casuale con "Il lato sinistro per un operatore ALL o ANY deve essere o un Errore NSArray o NSSet ".Il lato sinistro per un operatore ALL o ANY deve essere un NSArray o un NSSet

L'app in caso di arresto anomalo sta cercando di leggere da Core Data. Non si blocca tutto il tempo, solo in modo casuale. Non sono sicuro che il PREDICATO che causa il problema o due thread acceda ai Core Data? Se fosse il PREDICATO, penserei che si romperà ogni volta. Sono state diverse migrazioni alla struttura db, quindi forse una delle migrazioni ha lasciato un oggetto in uno stato strano e il suo arresto anomalo quando quell'oggetto è mai stato recuperato da Core Data?

Ecco richiama il predicato

+(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"]]; 
} 

METODO === dove la sua ARRESTO ======

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

...... 

} 

=== ECCO lo stack di chiamate ====

*** 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 
+0

Che aspetto ha il predicato che contiene l'operatore "ALL o ANY"? –

+0

Si creano diversi predicati (utilizzando metodi sconosciuti come buildCompoundContainsStringForField), quindi non è chiaro (per me) quale richiesta di ricerca o di predicato sta causando l'arresto anomalo. - Forse è possibile impostare un "punto di interruzione di eccezione" e quindi "po request" nella console del debugger quando si verifica l'arresto anomalo. Sarebbe utile anche l'informazione sulle entità e le relazioni. –

+0

È causato dal predicato TITLE che è QUALSIASI titolo CONTAINS [c] "sh" Aggiungerà anche il post originale e includerà quel metodo. – jdog

risposta

7

Il problema è che l'operatore ANY non è necessario qui. Come ha detto Martin R, ANY è usato con molte relazioni. Quindi, se avete qualcosa di simile:

class Recipe 
{ 
    public String title; 
} 

class CookBook 
{ 
public Array recipes; 
} 

e si desidera trovare tutti i libri di cucina che hanno una ricetta con un certo titolo, allora si usa predicato:

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

se si desidera solo tutta la ricetta oggetti che corrispondono al tuo titolo quindi l'operatore ANY non è necessario. Basta usare:

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

Se si desidera una più approfondita spiegazione leggere: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Predicates.pdf

In particolare, prestare attenzione alla sezione "Utilizzo di predicati con Key-Percorsi". Speriamo che questo aiuti.

+0

Ben spiegato, ho una domanda qui, supponiamo che il titolo (ad uno) abbia una serie di ricevimenti (per molti), in tal caso abbiamo bisogno di QUALSIASI o no, poiché ho anche affrontato raramente l'arresto quando usato ANY in questo caso come (@ "ANY title.recipes. @ count> 0") – Bharath

Problemi correlati