преобразование NSArray в RLMarray с помощью RKValueTransFormer не удается преобразовать outputValue в AutoreleasingUnsafeMutablePointer‹AnyObject?›

Я использую RestKit и realm.io вместе. У меня есть массив значений (массив представляет собой строки URL-адресов изображений), возвращаемый в JSON, который должен стать RLMArray из RLMObjects. Я считаю, что сопоставления настроены правильно, потому что он пытается преобразовать результаты в RLMArray. Но я получаю следующую ошибку от RestKit:

restkit.object_mapping:RKMappingOperation.m:449 Failed transformation of value at keyPath 'picList' to representation of type 'RLMArray': Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3002 "Failed transformation of value '(
"Picture {\n\turl = ;\n\tremote_url = http://placekitten.com/g/500/500;\n}",
"Picture {\n\turl = ;\n\tremote_url = http://placekitten.com/g/400/400;\n}",
"Picture {\n\turl = ;\n\tremote_url = http://placekitten.com/g/300/300;\n}"
)' to RLMArray: none of the 2 value transformers consulted were successful."

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

func setupValueTransformerForPicList(){

    println("called value transformer function")
    var picListValueTransformer = RKBlockValueTransformer(validationBlock: { (inputClass:AnyClass!,outputClass:AnyClass!) -> Bool in

        if (inputClass.className() == "Array" || inputClass.className() == "__NSArrayM") && outputClass.className() == "RLMArray" {
            return true
        }
        return false

        }) { (inputValue:AnyObject!, var outputValue, outputClass, error) -> Bool in

            println("called value transformer")
            if let thisArray:NSArray = inputValue as? NSArray{
                var picRlmArray:RLMArray = RLMArray(objectClassName: Picture.className())
                for item in thisArray {
                    if let thisPicture:Picture = item as? Picture{
                        picRlmArray.addObject(thisPicture)
                    } else {
                        return false

                    }
                }
                outputValue = picRlmArray // this is the line that throws the error
                return true
            }
            return false
    }
    RKValueTransformer.defaultValueTransformer().addValueTransformer(picListValueTransformer)
}

Однако я получаю сообщение об ошибке:

'RLMArray' is not convertible to 'AutoreleasingUnsafeMutablePointer<AnyObject?>'

Я пробовал опускаться

 outputValue = picRlmArray as AutoreleasingUnsafeMutablePointer<AnyObject?>

с тем же результатом. Я пробовал делать что бы это ни было (если это вообще что-то)

outputValue = picRlmArray as AutoreleasingUnsafeMutablePointer<RLMArray?>

и получить ошибку

'RLMArray' is not identical to 'AnyObject'

Я немного не в себе, но чувствую, что это определенно должно быть достижимо. Любая помощь будет принята с благодарностью. Благодарю вас!

ИЗМЕНИТЬ:

Я также не могу вернуть быстрый массив из этой функции. Выдает ту же ошибку. Я думаю, что это может быть более общий вопрос о том, как возвращать типы, которые не являются AnyObjects.


person Mike Wrather    schedule 04.12.2014    source источник
comment
Не используйте className(), проверьте тип класса (isKindOfClass). Ваш код вызывается? И я не писал никакого быстрого, но должен быть параметр inout вместо var?   -  person Wain    schedule 05.12.2014
comment
Спасибо, спасибо. Но я думаю, что isKindOfClass - это метод для объектов, а не классов, а inputClass и outputClass имеют тип AnyClass. Когда я пытаюсь использовать inout, я получаю несоответствие типов. И да, код вызывается.   -  person Mike Wrather    schedule 05.12.2014
comment
Справедливости ради, isSubclassOfClass является подходящим методом для использования. Я предполагаю, что это проблема быстрого кастинга, но я не могу дать много советов по этому поводу...   -  person Wain    schedule 08.12.2014


Ответы (1)


В настоящее время я являюсь сопровождающим RestKit, и мне грустно говорить, что у меня не было возможности поиграть с RestKit и Realm вместе, особенно со Swift.

Я посмотрю, что может быть причиной этой ошибки.

РЕДАКТИРОВАТЬ:

Мне кажется, что outputValue.memory = picRlmArray вместо outputValue = picRlmArray поможет!

person segiddins    schedule 08.12.2014
comment
Большое спасибо @segiddins. Я думаю, что это не обязательно проблема Realm, а скорее проблема того, какой тип значения может быть возвращен из преобразователя значений и как эти значения преобразуются с помощью swift. Например, как я уже упоминал в редактировании, я также не могу вернуть простой массив Swift. Однако я новичок в программировании для iOS, и, возможно, я чего-то не знаю об AutoreleasingUnsafeMutablePointers. В любом случае, я очень ценю, что вы изучаете это. -Майк - person Mike Wrather; 09.12.2014
comment
Не волнуйтесь! Я предполагаю, что проблема на самом деле просто в назначении объекта косвенному указателю в целом. - person segiddins; 09.12.2014
comment
@MikeWrather Я только что отредактировал свой ответ, пожалуйста, дайте мне знать, если это решение работает для вас! - person segiddins; 09.12.2014
comment
все, что вам платят, недостаточно. Можете ли вы дать некоторое представление о том, как работает это решение? Спасибо!! - person Mike Wrather; 09.12.2014
comment
outputValue — это AutoreleasingUnsafeMutablePointer, и вам нужно установить фактический memory, на который указывает этот указатель. - person segiddins; 09.12.2014
comment
Хотите знать, каковы ваши впечатления от смешивания Restkit и Realm @MikeWrather, не могли бы вы поделиться своими мыслями? - person Andrespch; 26.05.2015
comment
Привет, @Andrespch. И Realm, и Restkit — потрясающие фреймворки. У Restkit есть много функций, которые делают его удобным для использования с CoreData, но мне удалось настроить его так, чтобы он соответствовал моим потребностям с Realm. Тем не менее, вы можете видеть из вопроса, который я задал, что для того, чтобы заставить их играть вместе, требуется тяжелая ручная работа. Я не эксперт ни в одной из платформ, поэтому, вероятно, есть более элегантные решения, чем те, которые я разработал. Есть ли у вас какие-либо конкретные вопросы относительно совместимости? - person Mike Wrather; 26.05.2015
comment
@Andrespch - также, судя по тому факту, что Сегиддинс носит футболку Realm на своей новой фотографии и поддерживает ресткит, он, вероятно, тот, кому вы хотите задать этот вопрос. - person Mike Wrather; 26.05.2015
comment
хахаха, да, наверное, @MikeWrather. Я просто спрашиваю, потому что я начинаю использовать их вместе для относительно большого проекта, поэтому мне просто интересно, не могли бы вы посоветовать против этого после того, как какое-то время использовали оба фреймворка вместе, я думаю, что одна классная новая функция для RestKit будет быть автоматическим сопоставлением массивов JSON в RLMarrays, возможно, я в конечном итоге попытаюсь создать класс RKValueTransformer, который делает это, если я это сделаю, и результат будет хорошим, я вернусь, чтобы поделиться им. - person Andrespch; 26.05.2015
comment
@Andrespch - да, это почти то, что делает приведенный выше преобразователь значений. Проект, который я построил, тоже был большим, и я впервые использовал любую технологию (и Swift, если уж на то пошло). Не безболезненно, но что? - person Mike Wrather; 27.05.2015