Hallo Zusammen,
ich stehe gerade vor einem für mich sehr komische Problem. Ich habe eine iPhone App mit einer Apple Wacht Erweiterung erstellt. An sich läuft auch beides recht gut, nur das Update der Daten über Core Data bringt mich gerade zum verzweifeln. Zu erst ging ich davon aus, dass es ein Darstellungsproblem auf der Apple Watch ist, aber dies konnte ich auf ein Core Data refresh/fetch Problem eingrenzen.
Aber gut was ist überhaupt das Problem :-). Ich habe meine Core Data DB über App Groups aufgebaut, so dass iPhone und Watch auf die gleiche DB zugreifen können. Wenn ich jetzt eine Änderung auf der Watch durchführe, soll diese auch auf dem iPhone zusehen sein. Dies geht aber leider nur mit folgender Einschränkung. Die Änderung wird auf der Apple Watch zu 100% dargestellt z.B.: Person A hatte 50€ und dies wird über die Watch auf 0€ geändert. Dann kann man auf der Watch dies in der Übersicht sehen und in der Detailansicht wo auch der Button ist um den Wert zu ändern.
Auf dem iPhone hingeben wird die Änderung bei der Übersicht nicht dargestellt aber bei der Detailsicht. Was mich natürlich extrem verwundert. Wenn man sich die Daten von Core Data anzeigen lässt, sieht ma auch das der fetch in der Übersicht alte Daten anzeigt. Genau das gleiche Verhalten habe ich,wenn ich den Wert über das iPhone ändere. So ist die Übersicht auf der Watch alt und die Dateiansicht neu.
Hier mein Code wie ich fetche und meine UITable mit Daten fülle:
Alles anzeigen
Wie man in dem Init sehen kann, habe ich das MMWormhole verwendet um mit zu bekommen, ob es eine Änderung auf dem iPhone gab. Der dargestellte Code bezieht sich auf die Watch Erweiterung.
Vielen Dank
ich stehe gerade vor einem für mich sehr komische Problem. Ich habe eine iPhone App mit einer Apple Wacht Erweiterung erstellt. An sich läuft auch beides recht gut, nur das Update der Daten über Core Data bringt mich gerade zum verzweifeln. Zu erst ging ich davon aus, dass es ein Darstellungsproblem auf der Apple Watch ist, aber dies konnte ich auf ein Core Data refresh/fetch Problem eingrenzen.
Aber gut was ist überhaupt das Problem :-). Ich habe meine Core Data DB über App Groups aufgebaut, so dass iPhone und Watch auf die gleiche DB zugreifen können. Wenn ich jetzt eine Änderung auf der Watch durchführe, soll diese auch auf dem iPhone zusehen sein. Dies geht aber leider nur mit folgender Einschränkung. Die Änderung wird auf der Apple Watch zu 100% dargestellt z.B.: Person A hatte 50€ und dies wird über die Watch auf 0€ geändert. Dann kann man auf der Watch dies in der Übersicht sehen und in der Detailansicht wo auch der Button ist um den Wert zu ändern.
Auf dem iPhone hingeben wird die Änderung bei der Übersicht nicht dargestellt aber bei der Detailsicht. Was mich natürlich extrem verwundert. Wenn man sich die Daten von Core Data anzeigen lässt, sieht ma auch das der fetch in der Übersicht alte Daten anzeigt. Genau das gleiche Verhalten habe ich,wenn ich den Wert über das iPhone ändere. So ist die Übersicht auf der Watch alt und die Dateiansicht neu.
Hier mein Code wie ich fetche und meine UITable mit Daten fülle:
C-Quellcode
- #pragma mark - ViewDidLoad
- -(instancetype)init {
- self = [super init];
- if (self) {
- // perform initialization
- self.numberF = [[NSNumberFormatter alloc] init];
- [self.numberF setNumberStyle:NSNumberFormatterDecimalStyle];
- [self.numberF setMaximumFractionDigits:2];
- self.numberF.numberStyle = NSNumberFormatterCurrencyStyle;
- self.wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:@"group.de.bitsmaker.itravel" optionalDirectory:@"wormhole"];
- [self.wormhole listenForMessageWithIdentifier:@"updateFromPhone" listener:^(id messageObject) {
- NSLog(@"recieved update from wormhole !!");
- [JSMCoreDataHelper performOnFetchResultController:self.fetchedResultsController];
- [self reloadData];
- }];
- }
- return self;
- }
- -(void) willActivate {
- [JSMCoreDataHelper performOnFetchResultController:self.fetchedResultsController];
- [self reloadData];
- }
- - (void)reloadData {
- [self.tableWithPersonsTheyPay setNumberOfRows:[self.fetchedResultsController.fetchedObjects count] withRowType:@"AWPersonTableCell"];
- __weak __typeof__(self) weakSelf = self;
- [[self.fetchedResultsController fetchedObjects] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
- __strong __typeof__(self) strongSelf = weakSelf;
- [strongSelf.noDataLabel setHidden:YES];
- [strongSelf configureRowAtIndex:idx];
- }];
- }
- - (void)configureRowAtIndex:(NSUInteger)index {
- __weak __typeof__(self) weakSelf = self;
- dispatch_async(dispatch_get_main_queue(), ^()
- {
- __strong __typeof__(self) strongSelf = weakSelf;
- NSNumber *sumCostsForPerson;
- AWPersonTableRow* row = [strongSelf.tableWithPersonsTheyPay rowControllerAtIndex:index];
- NSIndexPath *realIndexPath = [NSIndexPath indexPathForRow:index inSection:0];
- BMPerson *person = [self.fetchedResultsController objectAtIndexPath:realIndexPath];
- row.firstNameLabel.text = @"";
- row.lastNameLabel.text = @"";
- row.firstNameLabel.text = person.vorname;
- row.lastNameLabel.text = person.nachname;
- NSPredicate* suchePerson = [NSPredicate predicateWithFormat:@"%K == %@", cEntityKostenRelationshipPerson, person];
- sumCostsForPerson = @(0);
- for (BMKosten* gefundeneKosten in [person.kosten filteredSetUsingPredicate:suchePerson]) {
- if (gefundeneKosten) {
- if (gefundeneKosten.wertOffen.integerValue <0) {
- if (gefundeneKosten.wertGezahltAnPerson.integerValue < 0) {
- sumCostsForPerson = [NSNumber numberWithDouble: ( sumCostsForPerson.integerValue + gefundeneKosten.wertOffen.integerValue -1* gefundeneKosten.wertGezahltAnPerson.integerValue)];
- }else{
- sumCostsForPerson = [NSNumber numberWithDouble: (sumCostsForPerson.integerValue + gefundeneKosten.wertOffen.integerValue + gefundeneKosten.wertGezahltAnPerson.integerValue)];
- }
- }else{
- if (gefundeneKosten.wertGezahltAnPerson.integerValue < 0) {
- sumCostsForPerson = [NSNumber numberWithDouble: ( sumCostsForPerson.integerValue + gefundeneKosten.wertOffen.integerValue + gefundeneKosten.wertGezahltAnPerson.integerValue)];
- }else{
- sumCostsForPerson = [NSNumber numberWithDouble: ( sumCostsForPerson.integerValue + gefundeneKosten.wertOffen.integerValue + gefundeneKosten.wertGezahltAnPerson.integerValue)];
- }
- }
- }
- }
- //Minus Zeichen bei Null entfernen
- row.betragLabel.text = @"";
- row.betragLabel.text = [self.numberF stringFromNumber:[BMToolBox setStringWithNumberOfVauleOrZero:[BMToolBox changeCentsToMoney:sumCostsForPerson]]];
- NSLog(@"Person: %@ Kosten: %@", person.vorname, sumCostsForPerson);
- //Farben zuweisen an Hand der Summe ob rot oder grün
- [row.betragLabel setTextColor:[BMToolBox setColorForVaule:sumCostsForPerson.integerValue]];
- });
- }
- -(NSFetchedResultsController *)fetchedResultsController {
- if(self.detailEventFetchResultsController != nil) {
- return self.detailEventFetchResultsController;
- }
- NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
- NSEntityDescription *entityDescription = [NSEntityDescription entityForName:cEntityPerson inManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
- fetchRequest.entity = entityDescription;
- fetchRequest.predicate = self.fetchPredicate;
- fetchRequest.fetchBatchSize = 64;
- NSSortDescriptor *sortPerson = [[ NSSortDescriptor alloc] initWithKey:cEntityPersonAttributeVorname ascending:YES];
- NSArray *sortArray = [NSArray arrayWithObject:sortPerson];
- fetchRequest.sortDescriptors = sortArray;
- self.detailEventFetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[JSMCoreDataHelper managedObjectContext] sectionNameKeyPath:nil cacheName:nil];
- self.detailEventFetchResultsController.delegate = self;
- return self.detailEventFetchResultsController;
- }
Vielen Dank
Vielen Dank
Gruß
Bongartz
Gruß
Bongartz