2015-05-17 9 views
5

Stworzyłem podklasę PFObject, zasadniczo postępując zgodnie z instrukcjami na i przypinałem obiekt lokalnie. Doktryny pars nie wydają się pobierać podklasy PFObject i zastanawiam się - czy możliwe jest rzutowanie pobranego obiektu jako podklasy PFObject. Jeśli tak to jak?parse.com w Swift - czy można pobrać pobraną PFObject jako podklasę?

(rozumiem, jeśli nie jest to możliwe, może być konieczne ponowne instancję podklasy, na podstawie wyszukanych właściwości 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

Czy próbowali robić 'jeśli obiekt jest Armor {...}' ' – sbarow

+0

(obiekt jest Armor)' jest równa false. –

+0

Którą wersję biblioteki Parse używasz? – siegy22

Odpowiedz

12

Bądź pewien, że zarejestrował podklasę w application:didFinishLaunchingWithOptions:. W moim przypadku nie rzutuje pobranego obiektu jako podklasy 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") 
        } 
       } 
      } 
     } 
    }) 
} 

wyjście Console

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

Postępuję zgodnie z instrukcjami i przykładowym kodem w sekcji podklasowania dokumentów parse.com, która wywołuje metodę registerSubclass() w metodzie initialize. Zamierzam przekazać twoją sugestię, zamiast rejestrowania podklasy w AppDelegate. Kiedy odzyskujesz swój obiekt, możesz go rzucić jako swoją podklasę zamiast PFObject? –

+2

Przetestowałem twoją teorię i masz rację. Zarejestrowanie podklasy w delegacie aplikacji wydaje się działać, natomiast rejestracja w metodzie inicjalizacji, jak w przykładowym kodzie w dokumentach, nie działa! –

+0

Fajnie, jestem w procesie edycji mojego kodu –

Powiązane problemy