gpt4 book ai didi

ios - PFObject 未被转换为子类

转载 作者:行者123 更新时间:2023-11-28 06:55:09 24 4
gpt4 key购买 nike

*子类在我的应用委托(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 数据库中提取教室并将其放入 TableView 行单元格中的查询:

查询:

    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

应用委托(delegate):

    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()

**根据 Daniel 的修复新代码...

所以对象被读取为 classroom 但现在尝试从 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

最佳答案

您遇到的问题是转换为 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)

关于ios - PFObject 未被转换为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33851636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com