PFObject没有被转换为子类

时间:2015-11-22 04:35:23

标签: ios xcode swift parse-platform subclassing

*子类在我的app delegate

中注册

用户可以创建classroom个对象。问题是,当创建新的classroom对象时,以下查询会将最新的classroom读作PFObject。这会使程序崩溃。

以前制作的classrooms将被正确阅读。

此外 - 当我关闭应用程序并重新启动它时,最新的教室被正确读取为classroom。如何将新创建的教室投射到正确的子类中?

收到的错误是:

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

谢谢!

classroom对象的类代码:

    class Classroom: PFObject, PFSubclassing{

var professorLastName: String?
var classTitle: String?
var toSchool: School?
var subjectLevel: String?
var subject: String?
var enrolledUsers: [PFUser]?

//THIS IS FOR CREATING A NEW CLASS
func enrollClass(){
    let classroom = PFObject(className: "Classroom")

    classroom["subject"] = self.subject
    ...


    classroom.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
        print("added student to class.")
    }
} 

    //start protocol code for PFSubclass
static func parseClassName() -> String {
    return "Classroom"
}

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

这是从Parse数据库中提取教室并将其放入表视图行单元格的QUERY:

QUERY:

    let query = PFQuery(className: "_User")
    query.includeKey("enrolledClasses")
    query.getObjectInBackgroundWithId(PFUser.currentUser()!.objectId!) {(result:PFObject?, error: NSError?) -> Void in
        let userEnrolledClasses = result!["enrolledClasses"] as! [Classroom]
        completionBlock(userEnrolledClasses) 

插入行单元格:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("enrolledClassCell") as! EnrolledClassesTableViewCell

    //THE CODE CRASHES HERE!!!! 
    let classroom = timelineComponent.content[indexPath.row] as? Classroom
    //NSARRAY FAILED TO MATCH ARRAY TYPE -> It's still PFObject



    classroom?.setClass()
    cell.enrolledOption.text = classroom?.classTitle
    return cell
}

读数: enter image description here

的AppDelegate:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Classroom.registerSubclass()
    School.registerSubclass()
    Post.registerSubclass()
    PostPoints.registerSubclass()
    ReplyPost.registerSubclass()
    ReplyPostPoints.registerSubclass()
    SubjectList.registerSubclass()

    Parse.enableLocalDatastore()

**根据丹尼尔的修正新代码...

因此,对象被视为classroom,但现在尝试从教室对象中提取数据是行不通的。所以我想将一个标签设置为表格行的classroom.classTitle,但数据总是为零......

    //TIMELINE IMPLEMENTATION
func loadInRange(range: Range<Int>, completionBlock: ([Classroom]?) -> Void) {
    Classroom.registerSubclass()

    let query = PFQuery(className: "_User")
    query.includeKey("enrolledClasses")
    query.getObjectInBackgroundWithId(PFUser.currentUser()!.objectId!) {(result:PFObject?, error: NSError?) -> Void in

        let rawPFObject = result!["enrolledClasses"] as! [PFObject]
        var classroomArray: [Classroom] = []

        for rawClassroom in rawPFObject{
            let convertedClassroom = Classroom()
            convertedClassroom.classTitle = rawClassroom["classTitle"] as? String
            convertedClassroom.subject = rawClassroom["subject"] as? String
            convertedClassroom.professorLastName = rawClassroom["professorLastName"] as? String
            convertedClassroom.subjectLevel = rawClassroom["classTitle"] as? String
            classroomArray.append(convertedClassroom)
        }

        completionBlock(classroomArray)

    }
}

标签分配:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("enrolledClassCell") as! EnrolledClassesTableViewCell
    //the tableViewCell post is equal to the post[arrayNumber]
    let classroom = timelineComponent.content[indexPath.row] as? Classroom
    //CLASSROOM VALUES ARE ALL NIL HERE
    classroom?.setClass()
    cell.enrolledOption.text = classroom?.classTitle
    return cell
}

控制台读数:

enter image description here

也许它与objectId是“new”有关吗?

timelineComponent.content

的读数

enter image description here

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,在您的查询中,转换为Classroom数组无法正常工作。这可能是Parse对象子类的缺点。

解决方法是创建一个将传递给completionBlock的临时数组。

在这个临时数组中将添加Classroom个显式创建为Parse子类的对象。

在您的课堂课程中,添加:

func loadFromObject(object: PFObject) {
    // Setup a Classroom object from a PFObject.

    self.subject = object["subject"]

   ...
}

在您的查询中,替换这些行

let userEnrolledClasses = result!["enrolledClasses"] as! [Classroom]
completionBlock(userEnrolledClasses) 

var classroomArray = Array<Classroom>()

for class in result!["enrolledClasses"] {
    let newClass = Classroom().loadFromObject(class)
    classroomArray.append(newClass)
}

completionBlock(classroomArray)