2015-03-13 12 views
6

Với nhanh chóng 1,2, tôi không còn có thể lấy một mảng của nhà thơ với phân tích phân lớp và downcasting nó với phân lớp khác.PFSubclassing với mảng con trỏ và nhanh chóng 1,2 - lỗi nghiêm trọng: NSArray yếu tố không phù hợp với Swift Array Element loại

tôi luôn luôn tìm thấy lỗi:

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

Bạn có một ý tưởng hay nó có thể đến?

Mã:

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 

Cảm ơn thời gian của bạn

+0

Truyền 'shot' sang' PFObject' thay vì 'ShotModel', sau đó bạn có thể nhận được ' shot.valueForKey ("pics") '. Hãy thử một khi nó làm việc cho tôi. –

+0

Có tôi có quyền truy cập vào 'shot.valueForKey (" pics ")' với cast 'ShotModel' nhưng tôi không thể downcast' shot.valueForKey ("pics") 'thành' [PicModel] ' –

+0

Cố gắng thay đổi' @NSManaged var pics: [PicModel] 'to' @NSQuản lý các bức ảnh var: [** PFObject **] 'Tôi đã giải quyết vấn đề tương tự bằng cách truyền tới' PFObject' –

Trả lời

15

Vấn đề đến từ một phần mã này:

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

registerSubclass() cho ShotModel được gọi trước khi registerSubclass() cho PicModel.

tôi đã giải quyết với điều này trong appdelegate:

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

Đáng kinh ngạc: điều này làm việc như một sự quyến rũ! – Roshambo

+0

Điều này đã không làm việc cho tôi cho đến khi tôi đặt các cuộc gọi .registerSubclass() trước khi khởi tạo Parse. Bây giờ nó hoạt động tuyệt vời. Lỗi bực bội mặc dù. Cảm ơn! –

+0

Tôi đã giải quyết nó bằng cách thêm PicModel.initialize() vào dòng đầu tiên của việc khởi tạo ShotModel – zirinisp

1

Bằng cách nào đó tôi cũng đã để init đối tượng sau khi đăng ký ở AppDelegate:

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

Vấn đề nằm ở thực tế là ShotModel được đăng ký như một lớp con trước PicModel. Để đảo ngược, chúng ta có thể gọi PicModel khởi tạo sự khởi tạo của ShotModel.

Bằng cách này, chúng tôi giữ giải pháp được đề xuất bằng cách phân tích cú pháp và đảm bảo rằng các lớp học được đăng ký theo đúng thứ tự.

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

Điều này rất hữu ích. Cảm ơn bạn –

0

Tôi thực sự đã đệ đơn bug chống phân tích cú pháp vì lý do này rất giống nhau và họ đã kết thúc cập nhật tài liệu subclassing của họ như sau:

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.

Vì vậy, bạn cần phải gọi phương pháp registerSubclass(), hoặc bất kỳ phương thức nào khác cho lớp được đăng ký đúng với Parse.

Các vấn đề liên quan