【问题标题】:parse.com in Swift - is it possible to cast retrieved PFObject as subclass?Swift 中的 parse.com - 是否可以将检索到的 PFObject 转换为子类?
【发布时间】:2015-05-17 18:56:17
【问题描述】:

我创建了 PFObject 的子类,基本上遵循parse.com docs 上的说明,并将对象固定在本地。解析文档似乎没有涉及检索 PFObject 子类,我想知道 - 是否可以将检索到的对象转换为 PFObject 子类。如果有,怎么做?

(我知道如果不可能,可能需要根据检索到的 PFObject 属性重新实例化子类。)

   let query = PFQuery(className:Armor.parseClassName())
    query.fromLocalDatastore()
    query.findObjectsInBackgroundWithBlock({
        (objects:[AnyObject]?, error: NSError?) in
        if let error = error {
            // There was an error
        } else {
            if let objects = objects as? [PFObject] {
                for object in objects {
                    //This println is outputting to the console:
                    println("PFObject object retrieved")
                    if let object = object as? Armor {
                          //This println is NOT outputting to the console:
                          println("PFObject object cast as Armor")
                    }
                }
            }
        }
    })

【问题讨论】:

  • 你试过if object is Armor { ... }
  • (object is Armor) 等于 false。
  • 您使用的是什么 Parse 库版本?
  • 您在 AppDelegare 中注册了子类吗?
  • @RaVeN 解析库 1.7.2

标签: ios swift parse-platform


【解决方案1】:

确保您已在 application:didFinishLaunchingWithOptions: 中注册了子类。就我而言,它不会将检索到的对象转换为 PFObject 子类。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    Armor.registerSubclass()

    Parse.enableLocalDatastore()
    Parse.setApplicationId(..., clientKey: ...)

    return true
}

AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    CatsObject.registerSubclass()

    Parse.enableLocalDatastore()
    Parse.setApplicationId("...", clientKey: "...")

    return true
}

CatsObject.swift

import Foundation

class CatsObject: PFObject, PFSubclassing {
    static func parseClassName() -> String {
        return "Cat"
    }
}

CatViewController.swift

override func viewDidLoad() {
    queryData()
}

func queryData() {
    let query = PFQuery(className: CatsObject.parseClassName())
    query.fromLocalDatastore()
    query.findObjectsInBackgroundWithBlock({
        (objects:[AnyObject]?, error: NSError?) in
        if let error = error {
            // There was an error
        } else {
            println("count local objects = \(objects?.count)")
            if let objects = objects as? [PFObject] {
                for object in objects {
                    println("PFObject object retrieved")
                    if object is CatsObject {
                        println("object is CatsObject subclass")
                    }

                    if let object = object as? CatsObject {
                        println("PFObject object cast as CatsObject")
                    }
                }
            }
        }
    })
}

控制台输出

count local objects = Optional(10)
PFObject object retrieved
object is CatsObject subclass
PFObject object cast as CatsObject

【讨论】:

  • 我正在遵循 parse.com 文档的子类化部分中的说明和示例代码,它在初始化方法中调用 registerSubclass()。我将尝试一下您的建议,而不是在 AppDelegate 中注册子类。当您检索您的对象时,您是否可以将其转换为您的子类而不是 PFObject?
  • 我已经测试了你的理论,你是对的。在 Application 委托中注册子类似乎有效,而按照文档中的示例代码在初始化方法中注册它却不行!
  • 我遇到了一个相关问题 - 我在将自定义对象添加到子类 PFObject 时遇到问题,并且添加了另一个堆栈溢出问题。也许你想看看? stackoverflow.com/questions/30338526/…
  • 像魅力一样工作!我遇到了一个让我疯狂尝试调试的问题,结果是我忘记为我创建的新 Parse 类注册子类。再次感谢!
猜你喜欢
  • 2016-08-17
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多