2015-05-17 27 views
5

我已經創建了PFObject的子類,基本上遵循的說明,並在本地固定對象。解析文檔似乎沒有進入檢索PFObject子類,我想知道 - 是否可以將檢索到的對象作爲PFObject子類進行轉換。如果是這樣,怎麼樣?parse.com在Swift中 - 是否可以將檢索到的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") 
        } 
       } 
      } 
     } 
    }) 
+0

您是否嘗試過做'如果對象是護甲{...}'' – sbarow

+0

(對象是護甲)'等於假。 –

+0

你使用什麼解析庫版本? – siegy22

回答

12

確保您已經註冊子類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 
+0

我遵循parse.com文檔的子類化部分中的說明和示例代碼,它在initialize方法中調用registerSubclass()。我要給你的建議去,而不是註冊AppDelegate中的子類。當你檢索你的對象時,你可以將它轉換爲你的子類而不是PFObject? –

+2

我測試了你的理論,你是對的。在Application委託中註冊子類似乎可行,而按照文檔中的示例代碼在初始化方法中註冊它不會! –

+0

很酷,我在我的代碼編輯過程 –

相關問題