Objective-C. NSString изменяется на NSCFNumber

У меня есть код в Objective-C. Я думаю, что я получил тип NSString, но когда я пытаюсь сохранить его в Core Data, я получаю user.clientID = clientID; ошибка, как:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "clientID"; desired type = NSString; given type = __NSCFNumber; value = 29.'

Итак, вот мой код:

мой менеджер данных синглтон PKDataManager.h

+(PKDataManager*) sharedManager;

- (void)updateCoreDataUserWithID:(NSString*) userID
                 andClientID:(NSString*) clientID;

PKDataManager.m

- (void)updateCoreDataUserWithID:(NSString*) userID
                 andClientID:(NSString*) clientID{

       PKUser*user = [NSEntityDescription 
       insertNewObjectForEntityForName:@"PKUser" 
       inManagedObjectContext:self.managedObjectContext];
       user.userID = userID;
       user.clientID = clientID; ///// error showing here
       [self.managedObjectContext insertObject:user];
       [self.managedObjectContext save:nil];
}

мой синглтон для API PKServerManager.h

+ (PKServerManager*) sharedManager;

- (void) sendUserID:(NSString*) userID
              onSuccess:(void(^)(NSString* clientID)) success
              onFailure:(void(^)(NSError* error, NSInteger statusCode)) failure;

PKServerManager.m

- (void) sendUserID:(NSString*) userID
                  onSuccess:(void(^)(NSString* clientID)) success
                  onFailure:(void(^)(NSError* error, NSInteger statusCode)) failure{
        NSDictionary* params =
        [NSDictionary dictionaryWithObjectsAndKeys:
         userID, @"userID", nil];
        [self.requestOperationManager
         POST:@"app/registration"
         parameters:params
         progress:nil
         success:^(NSURLSessionTask *task, NSDictionary* responseObject) {
            NSLog(@"JSON: %@", responseObject);
            NSString* clientID = (NSString*)[responseObject objectForKey:@"clientId"];
            if (success) {
                success(clientID);
            }
         } failure:^(NSURLSessionTask *operation, NSError *error) {
         }];
}

и мой КОД:PKProfile.m

[[PKServerManager sharedManager]
     sendUserID:profile.userID
     onSuccess:^(NSString* clientID) {
         NSLog(@"clientID %@", clientID);
         [[PKDataManager sharedManager] updateCoreDataUserWithID: profile.userID
                                                     andClientID: clientID];
     }
     onFailure:^(NSError *error, NSInteger statusCode) {
     }];

2 ответа

Решение

Ваша ошибка говорит о том, что в ответ включено числовое значение для идентификатора клиента (и представлено в responseObject как NSNumber; NSCFNumber является частью более широкого NSNumber кластер классов). Похоже, что ваш JSON-ответ содержал что-то вроде:

{
    ...,
    "clientId": 42
}

скорее, чем

{
    ...,
    "clientId": "42"
}

Вместо того, чтобы сосредоточиться на том, как преобразовать это NSNumber к NSStringВместо этого я склонен считать изменение идентификатора клиента в приложении NSInteger (или NSNumber). Если эти идентификаторы действительно являются числовыми значениями, лучше иметь тип, который отражает это.

В вашем PKServerManager.m

заменить следующую строку кода:

NSString* clientID = (NSString*)[responseObject objectForKey:@"clientId"];

с

NSString* clientID = [NSString stringWithFormat:@"%@",[responseObject objectForKey:@"clientId"]];
Другие вопросы по тегам