2015-01-13 3 views
4

У меня есть эта проблема. Я разрабатываю приложение в Swift и использую RestKit для извлечения и отправки данных обратно в API. Однако я попал в блок дорог. Если получен JSON полезной нагрузки содержит некоторое нулевое значение, то приложение Виль аварии с сообщением:RestKit JSON ошибка с нулевым значением

*** Нагрузочный приложение из-за неперехваченного исключением «NSInvalidArgumentException», причина: «- [длина NSNull]: непризнанные селектор направлен например 0x1994faba0 '

Что мне делать? Отображаемые свойства - это строки.

отображенный объект:

public class User: NSObject { 

    public var id: Int? = 0 
    public var email: String? 
    public var firstName: String? 
    public var lastName: String? 
    public var name: String? 
    public var office: String? 
    public var phone: String? 
    public var company: String? 

} 

Mapping:

let userMapping = RKObjectMapping(forClass: User.self) 
userMapping.addAttributeMappingsFromDictionary([ 
    "id": "id", 
    "email": "email", 
    "first_name": "firstName", 
    "last_name": "lastName", 
    "name": "name", 
    "company": "company", 
    "phone": "phone", 
    "office": "office", 
]) 
let responseDescriptor = RKResponseDescriptor(mapping: userMapping, pathPattern: currentUserPath, keyPath: "data", statusCodes: NSIndexSet(index: 200)) 
objectManager.addResponseDescriptor(responseDescriptor) 

JSON ответ:

{ 
    "status": "ok", 
    "data": { 
    "id": 1, 
    "email": "[email protected]", 
    "created_at": 1418832714451, 
    "updated_at": 1421077902126, 
    "admin": true, 
    "first_name": "John", 
    "last_name": "Doe", 
    "company": null, 
    "office": null, 
    "phone": null, 
    "name": "John Doe" 
    } 
} 

Он врезается на каждом из них: офис, телефон и имя.

+1

Показать JSON и ваше отображение. Улучшите JSON. Добавьте в свой код обработку NSNull. – Wain

+0

Я отредактировал свой вопрос, чтобы удовлетворить ваш запрос :) Как мне обращаться с NSNull самостоятельно с помощью RestKit? –

+0

Какая версия вы используете (она должна конвертировать в нуль действительно) – Wain

ответ

0

Попробуйте использовать другую версию RestKit. В базе данных RestKit были внесены изменения в отношении привязок нулевого значения.

+0

Я попробовал более старую версию, где он отображает null в JSON как nil в Swift/Obj-C –

+0

@ ZdeněkTopič может указать версию? –

0

@ Хоттикс прав, нули должны обрабатываться клиентом. Я считаю, что причиной этого сбоя является то, что Restkit не может правильно исследовать типы свойств класса в Swift. Мы решили это в нашем проекте, добавив явный целевой класс в нашу RKObjectMapping. Таким образом, вместо того, чтобы использовать метод addAttributeMappingsFromDictionary, попробуйте:

let userMapping = RKObjectMapping(forClass: User.self) 
let simpleMapping = RKAttributeMapping(fromKeyPath: "first_name", toKeyPath: "firstName") 
simpleMapping.propertyValueClass = NSString.classForCoder() // we used class for coder when we did our project, but you might have success with something else. 
userMapping.addPropertyMapping(simpleMapping) 

Вы должны сделать то же самое для отношений, а также, например, так:

let relationshipMapping = RKRelationshipMapping(fromKeyPath: "person", toKeyPath: "person", withMapping: Person.self) 
relationshipMapping.propertyValueClass = Person.classForCoder() 
userMapping.addPropertyMapping(relationshipMapping) 

Это позволяет автоматическое преобразование из NSNull в Swift дополнительно.

Смежные вопросы