【问题标题】:converting NSArray to RLMArray with RKValueTransFormer fails converting outputValue to AutoreleasingUnsafeMutablePointer<AnyObject?>使用 RKValueTransFormer 将 NSArray 转换为 RLMArray 无法将 outputValue 转换为 AutoreleasingUnsafeMutablePointer<AnyObject?>
【发布时间】:2014-12-04 19:58:42
【问题描述】:

我同时使用 RestKit 和 realm.io。我有一个以 JSON 格式返回的值数组(该数组是图片的 url 字符串),它应该成为 RLMObjects 的 RLMArray。我相信映射设置正确,因为它试图将结果转换为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 的类型的更普遍的问题。

【问题讨论】:

  • 不要使用className(),检查类类型(isKindOfClass)。你的代码被调用了吗?而且我没有写任何swift,但参数应该是inout而不是var
  • 谢谢韦恩。但我认为 isKindOfClass 是对象的方法,而不是类,inputClass 和 outputClass 的类型为AnyClass。当我尝试使用 inout 时,我得到类型不匹配。是的,代码被调用了。
  • 公平点,isSubclassOfClass 是合适的使用方法。我想这是一个快速的选角问题,但我对此无法提供太多建议......

标签: swift restkit restkit-0.20 realm


【解决方案1】:

我是 RestKit 的当前维护者,我很遗憾地说我没有太多机会一起使用 RestKit 和 Realm,尤其是不使用 Swift。

我将看看可能导致此错误的原因。

编辑:

在我看来,使用 outputValue.memory = picRlmArray 而不是 outputValue = picRlmArray 会成功!

【讨论】:

  • 非常感谢@segiddins。我认为这不一定是 Realm 问题,而是可以从值转换器返回什么类型的值以及如何快速转换这些值的问题。例如,就像我在编辑中提到的那样,我也无法返回一个简单的 swift 数组。不过,我是 iOS 编程的新手,也许关于 AutoreleasingUnsafeMutablePointers 有一些我不知道的地方。无论如何,我非常感谢您对此进行调查。 -迈克
  • 别担心!我的猜测是,问题实际上只是将对象分配给一般的间接指针。
  • @MikeWrather 我刚刚编辑了我的答案,如果该解决方案适合您,请告诉我!
  • 无论你得到什么报酬都不够。您能否深入了解此解决方案的工作原理?谢谢!!
  • outputValue 是一个AutoreleasingUnsafeMutablePointer,您需要做的是设置该指针指向的实际memory
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多