Tabelweergave wordt niet vernieuwd na JSON-bericht met behulp van RestKit-toewijzing

Ik gebruik RestKit om JSON-antwoorden in CoreData in kaart te brengen. Ik heb een tableview met UITextFields en een knop "Opslaan", die de gegevens naar de server POSTEN en opslaan. De serverdatabase is correct gewijzigd, maar de tabelweergave laadt opnieuw met de oude gegevens. Alleen als ik terug ga en vervolgens weer in de weergave, worden de juiste gegevens geladen.

Ik heb uren en uren gezocht naar een oplossing, maar niets dat ik probeerde werkte. Als ik [self loadData] achter de regel met de POST zet, loopt de app vast, waarschijnlijk omdat de POST nog niet is voltooid en er een conflict is. Als ik [self.tableview reloadData] in die regel zet, werkt het ook niet.

Hier is mijn code. Ik gebruik een NSManagedObject om de gegevens op te slaan, maar een nieuw gemaakt NSObject (CommunityOtherProfile) terug naar de server te verzenden.

Dit is mijn kaart:

   //CommunityProfile Object
RKManagedObjectMapping *profileMapping = [RKManagedObjectMapping mappingForClass:[CommunityProfile class] inManagedObjectStore:objectStore];
profileMapping.primaryKeyAttribute = @"uid";

[profileMapping mapKeyPath:@"uid" toAttribute:@"uid"];
[profileMapping mapKeyPath:@"nickname" toAttribute:@"nickname"];
[profileMapping mapKeyPath:@"hometown" toAttribute:@"hometown"];
[profileMapping mapKeyPath:@"male" toAttribute:@"male"];
[profileMapping mapKeyPath:@"age" toAttribute:@"age"];
[profileMapping mapKeyPath:@"description" toAttribute:@"profileDescription"];


[[RKObjectManager sharedManager].mappingProvider setMapping:profileMapping forKeyPath:@"communityProfile"];

mappingForSerialization = [profileMapping inverseMapping];
[[RKObjectManager sharedManager] setSerializationMIMEType:RKMIMETypeJSON];

[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:mappingForSerialization 
                                                                forClass:[CommunityProfile class]];

[[RKObjectManager sharedManager].router routeClass:[CommunityProfile class] toResourcePath:@"/community/profile/getMyProfile/" forMethod:RKRequestMethodGET];
//[[RKObjectManager sharedManager].router routeClass:[CommunityProfile class] toResourcePath:@"/community/profile/postMyProfile/" forMethod:RKRequestMethodPOST];


// CommunityOtherProfile Object
RKObjectMapping *profileMapping2 = [RKObjectMapping mappingForClass:[CommunityOtherProfile class]];

[profileMapping2 mapKeyPath:@"uid" toAttribute:@"uid"];
[profileMapping2 mapKeyPath:@"nickname" toAttribute:@"nickname"];
[profileMapping2 mapKeyPath:@"hometown" toAttribute:@"hometown"];
[profileMapping2 mapKeyPath:@"male" toAttribute:@"male"];
[profileMapping2 mapKeyPath:@"age" toAttribute:@"age"];
[profileMapping2 mapKeyPath:@"description" toAttribute:@"profileDescription"];

[[RKObjectManager sharedManager].mappingProvider setMapping:profileMapping2 forKeyPath:@""];

mappingForSerialization = [profileMapping2 inverseMapping];
[[RKObjectManager sharedManager] setSerializationMIMEType:RKMIMETypeJSON];

[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:mappingForSerialization 
                                                                forClass:[CommunityOtherProfile class]];

[[RKObjectManager sharedManager].router routeClass:[CommunityOtherProfile class] toResourcePath:@"/community/profile/postMyProfile/" forMethod:RKRequestMethodPOST];

Dit is waar de POST plaatsvindt:

- (void) save_clicked:(id)sender {

CommunityOtherProfile * newProfile = [[CommunityOtherProfile alloc] init];
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * ageNumber = [f numberFromString:age.text];

NSString *tempDescription = @"Platzhalter (noch nicht implementiert!)";

newProfile.male = isMale;
newProfile.profileDescription = tempDescription;
newProfile.nickname = nickname.text;
newProfile.hometown = hometown.text;
newProfile.age = ageNumber;


// post Object
[[RKObjectManager sharedManager] postObject:newProfile usingBlock:^(RKObjectLoader *loader){
    loader.targetObject = nil;
    loader.delegate = profileDataLoader;
}];
// I have tried to insert reloadData here }

andere belangrijke methoden in dezelfde klasse TableViewController:

- (void) refreshView: (id) sender{

NSFetchRequest *request = [CommunityProfile fetchRequest];
prof = [[CommunityProfile objectsWithFetchRequest:request] objectAtIndex:0];    

    self.uid = prof.uid;
    self.nickname.text = prof.nickname;
    self.age.text = [NSString stringWithFormat:@"%d", [prof.age intValue]];
    self.hometown.text = prof.hometown;

     //self.description.text = prof.description;

    if(prof.male == [NSNumber numberWithInt:1]) {
        [self clickMale:self.male];
    }
    else if(prof.male == [NSNumber numberWithInt:0]) {
        [self clickFemale:self.female];
    } }
- (void) loadData{
profileDataLoader = [[CommunityProfileDataLoader alloc] initWithDelegate:self];
[profileDataLoader loadData];

En tot slot, mijn dataLoader-klasse:

    //
//  CommunityProfileDataLoader.m
//

#import "CommunityProfileDataLoader.h"
#import "CommunityProfile.h"

@interface AbstractDataLoader()
@property CommunityEditProfileViewController *view;
@end


@implementation CommunityProfileDataLoader

@synthesize responseCode = _responseCode;
@synthesize view;

- (void) loadData{
    [super loadData];
    HCLog(DEBUG_MODE,@"Loading Profile Data");
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/community/profile/getMyProfile/" delegate:self];
}


- (void) triggerDelegate{
    HCLog(DEBUG_MODE,@"CommunityProfileDataLoader Triggering Delegate for %@", [super delegate]);
    [[super delegate] refreshView:self];
} /*...*/

Ik zou heel blij zijn als jullie konden helpen :)

1

1 antwoord

In uw tabel wordt een door community-kwaliteit ondersteunde klasse CommunityProfile uitgevoerd, maar wanneer u de POST-aanvraag verzendt, voegt u alleen uw nieuwe profiel toe aan een in geheugenklasse CommunityOtherProfile. Wanneer u probeert data opnieuw te laden in save_clicked: er is niets veranderd totdat het verzoek is voltooid. Wanneer u enige tijd later terugkeert naar de weergave, is de aanvraag teruggekomen en bevindt uw nieuwe object zich in de kerngegevens en dus in de tabelweergave.

Ik zou niet aanraden om het handmatig op te slaan omdat het lijkt alsof uw webservice de uid retourneert en u een duplicaat maakt. (Tip: als u besluit dit te doen, stelt u het doelobject van uw objectloader in om het handmatig gemaakte object te targeten!)

Ik zou willen voorstellen dat u de tabel herlaadt wanneer de webservice is teruggekeerd:

[[RKObjectManager sharedManager] postObject:newProfile usingBlock:^(RKObjectLoader *loader){
    loader.onDidLoadObject = ^(id obj) {
        [self refreshView: nil];
    };
}];
1
toegevoegd