Hallo zusammen,
ich bin etwas ratlos und könnte Hilfe gebrauchen:
Meine iOS-App nutzt CoreData zur Datenhaltung und führt dabei Batch Updates durch. Bei mir funktionieren diese problemlos, aber iTunes Connect berichtet manchmal von Crashes bei den Anwendern (unter 0,5%): Es sind immer Anweisungen in Apple-internen SQL-Routinen, hauptsächlich
Da ich mich nicht in der Lage sehe, diese Fehler zu vermeiden, habe ich den entsprechenden Aufruf in ein @try / @catch (Objective-C) gepackt. Dieses Vorgehen empfiehlt Apple auch ("The call to executeRequest() can throw an error and therefore requires the try keyword."), leider hatte ich dies anfangs übersehen:
Alles anzeigen
Obwohl ein entsprechende Update vor Wochen veröffentlich wurde, meldet iTunes Connect weiterhin entsprechende Crashes. Sind das nun nur Anwender, die das Update noch nicht installiert haben, oder übersehe ich etwas Maßgebliches?
Mattes
ich bin etwas ratlos und könnte Hilfe gebrauchen:
Meine iOS-App nutzt CoreData zur Datenhaltung und führt dabei Batch Updates durch. Bei mir funktionieren diese problemlos, aber iTunes Connect berichtet manchmal von Crashes bei den Anwendern (unter 0,5%): Es sind immer Anweisungen in Apple-internen SQL-Routinen, hauptsächlich
-[NSSQLiteConnection prepareSQLStatement:]
oder _execute
.Da ich mich nicht in der Lage sehe, diese Fehler zu vermeiden, habe ich den entsprechenden Aufruf in ein @try / @catch (Objective-C) gepackt. Dieses Vorgehen empfiehlt Apple auch ("The call to executeRequest() can throw an error and therefore requires the try keyword."), leider hatte ich dies anfangs übersehen:
Quellcode
- - (void)cleanupNotifications:(NSTimer *)sender
- {
- // Reset all subject reminder switches of the past
- NSBatchUpdateRequest *updateRequest = [NSBatchUpdateRequest batchUpdateRequestWithEntityName:kSRCoreDataSubjectEntity];
- NSPredicate *updatePredicate = [NSPredicate predicateWithFormat:@"subjectHasAlarm == YES AND subjectAlarmDate <= %@", [NSDate date]];
- updateRequest.predicate = updatePredicate;
- updateRequest.resultType = NSUpdatedObjectIDsResultType;
- updateRequest.propertiesToUpdate = @{@"subjectHasAlarm" : @NO};
- NSError *error = nil;
- NSBatchUpdateResult *updateResult = nil;
- @try
- {
- updateResult = [self.managedObjectContext executeRequest:updateRequest error:&error];
- }
- @catch (NSException *exception)
- {
- NSLog(@"NSException caught");
- NSLog(@"Name: %@", exception.name);
- NSLog(@"Reason: %@", exception.reason);
- NSLog(@"Stack Trace: %@", exception.callStackSymbols);
- }
- @finally
- {
- if (error) NSLog(@"Error cleaning up reminder switches: %@", error);
- // Update all objects in memory as the batch update works only on the persistent store
- NSArray *updatedObjects = updateResult.result;
- if (updatedObjects.count > 0)
- {
- [NSManagedObjectContext mergeChangesFromRemoteContextSave:@{NSUpdatedObjectsKey : updatedObjects} intoContexts:@[self.managedObjectContext]];
- DebugLog(@"Reset reminder switches (%lu items).", (unsigned long)updatedObjects.count);
- // Refresh all lesson views as reminder indicators might have changed
- NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
- [nc postNotificationName:kSRLessonRefreshNotification object:nil];
- }
- }
- }
Mattes
Diese Seite bleibt aus technischen Gründen unbedruckt.