2015-03-13 8 views
6

Mit swift 1.2 kann ich ein Array von Poiter mit Parse Subclass nicht mehr abrufen und es mit einer anderen Parse Subclass downcasting.PFSubclassing mit array pointer und swift 1.2 - fataler Fehler: NSArray Element konnte dem Swift Array Element Typ nicht entsprechen

fand ich immer die Fehlermeldung:

fatal error: NSArray element failed to match the Swift Array Element type 

Haben Sie eine Idee haben, oder es kommen kann?

Der Code:

import Foundation 

class ShotModel : PFObject, PFSubclassing { 

    /** 
    * MARK: Properties 
    */ 
    @NSManaged var name: String 

    @NSManaged var pics: [PicModel] 


    override class func initialize() { 
     var onceToken : dispatch_once_t = 0; 
     dispatch_once(&onceToken) { 
      self.registerSubclass() 
     } 
    } 

    class func parseClassName() -> String! { 
     return "Shot" 
    } 

} 

import Foundation 

class PicModel : PFObject, PFSubclassing { 

    /** 
    * MARK: Properties 
    */ 
    @NSManaged var name: String 


    override class func initialize() { 
     var onceToken : dispatch_once_t = 0; 
     dispatch_once(&onceToken) { 
      self.registerSubclass() 
     } 
    } 

    class func parseClassName() -> String! { 
     return "Pic" 
    } 

} 

// this cause error 

var shot: ShotModel = // a shot model get with fetchInBackgroundWithBlock 

shot.pics // fatal error: NSArray element failed to match the Swift Array Element type 

Vielen Dank für Ihre Zeit

+0

Cast 'shot' zu' PFObject' statt 'ShotModel' dann können Sie ' shot.valueForKey ("pics") 'bekommen. Versuchen Sie einmal, es hat für mich funktioniert. –

+0

Ja, ich habe Zugriff auf 'shot.valueForKey (" pics ")' mit Cast 'ShotModel', kann aber nicht' shown.valueForKey ("pics") 'to' [PicModel] ' –

+0

" @NSManaged "ändern var pics: [PicModel] 'zu' @NSManaged var pics: [** PFObject **] 'Ich hatte das selbe Problem gelöst, indem ich nach' PFObject' wendete –

Antwort

15

Das Problem aus diesem Teil des Codes kommen:

override class func initialize() { 
    var onceToken : dispatch_once_t = 0; 
    dispatch_once(&onceToken) { 
     self.registerSubclass() 
    } 
} 

registerSubclass() für ShotModel vor registerSubclass() für PicModel genannt.

Ich habe mit diesem in AppDelegate aufgelöst:

PicModel.registerSubclass() 
ShotModel.registerSubclass() 
+2

Unglaublich: das hat wie ein Zauber funktioniert! – Roshambo

+0

Dies funktionierte für mich nicht, bis ich die .registerSubclass() - Aufrufe vor der Initialisierung von Parse. Jetzt funktioniert es großartig. Frustrierende Bug obwohl. Vielen Dank! –

+0

Ich löste es durch Hinzufügen von PicModel.initialize() in der ersten Zeile der Initialisierung von ShotModel – zirinisp

1

Irgendwie hatte ich auch das Objekt init nach AppDelegate bei der Registrierung:

PicModel.registerSubclass() 
PicModel() 
ShotModel.registerSubclass() 
ShotModel() 
4

Das Problem liegt an der Tatsache, dass ShotModel registriert als Unterklasse vor PicModel. Um das zu invertieren, können wir PicModel Initialisierung die Initialisierung von ShotModel aufrufen.

Auf diese Weise behalten wir die vorgeschlagene Lösung parse und stellen sicher, dass die Klassen in der richtigen Reihenfolge registriert werden.

class ShotModel : PFObject, PFSubclassing { 

    /** 
    * MARK: Properties 
    */ 
    @NSManaged var name: String 

    @NSManaged var pics: [PicModel] 


    override class func initialize() { 
     var onceToken : dispatch_once_t = 0; 
     dispatch_once(&onceToken) { 
      PicModel.initialize() 
      self.registerSubclass() 
     } 
    } 
+0

Das war sehr hilfreich. Vielen Dank –

0

Ich legte tatsächlich eine bug gegen Parse für diese sehr gleichen Grund und sie beendeten ihre subclassing Dokumentation mit der folgenden Aktualisierung auf:

Please note that the initialize method is not called until the class receives its first message, meaning that you need to call any instance or class method on your subclass before it will be registered with Parse SDK.

So müssen Sie die registerSubclass() Methode aufrufen, oder jede andere Methode für die Klasse, die ordnungsgemäß mit Parse registriert wird.