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"]];