[英]Parse PFSubclassing not working with Swift
我復制了Subclassing的Parse Swift示例:
class Armor : PFObject, PFSubclassing {
override class func load() {
self.registerSubclass()
}
class func parseClassName() -> String! {
return "Armor"
}
}
我收到以下錯誤:
/Parse/Armor.swift:11:1: error: type 'Armor' does not conform to protocol 'PFSubclassing'
class Armor : PFObject, PFSubclassing {
^
__ObjC.PFSubclassing:15:28: note: protocol requires function 'object()' with type '() -> Self!'
@objc(object) class func object() -> Self!
^
__ObjC.PFSubclassing:23:52: note: protocol requires function 'objectWithoutDataWithObjectId' with type '(String!) -> Self!'
@objc(objectWithoutDataWithObjectId:) class func objectWithoutDataWithObjectId(objectId: String!) -> Self!
^
__ObjC.PFSubclassing:30:27: note: protocol requires function 'query()' with type '() -> PFQuery!'
@objc(query) class func query() -> PFQuery!
^
__ObjC.PFSubclassing:35:38: note: protocol requires function 'registerSubclass()' with type '() -> Void'
@objc(registerSubclass) class func registerSubclass()
^
/Parse/Armor.swift:14:9: error: 'Armor.Type' does not have a member named 'registerSubclass'
self.registerSubclass()
^ ~~~~~~~~~~~~~~~~
我看到了這個答案: https : //stackoverflow.com/a/24899411/843151並嘗試了解決方案沒有運氣,我得到了同樣的錯誤。
有關為什么會發生這種情況的任何建議? 提前致謝。
我需要在Objective-C橋接頭中導入解析PFObject + Subclass.h
#import <Parse/PFObject+Subclass.h>
使用xCode 6.1.1,我能夠在沒有橋接頭的情況下工作。 只是:
import Parse
在模塊的頂部。 對於類聲明,我確實需要使用@NSManaged作為變量類型,以使它們成功鏈接到Parse類變量。 像這樣:
class PSCategory : PFObject, PFSubclassing {
override class func load() {
self.registerSubclass()
}
class func parseClassName() -> String! {
return "Category"
}
@NSManaged var Name: String
}
然后在我的查詢中,所有名稱都是動態鏈接的:
var query = PSCategory.query() // PFQuery(className: "Category")
query.cachePolicy = kPFCachePolicyCacheElseNetwork // kPFCachePolicyNetworkElseCache
query.maxCacheAge = 60 * 60 * 24 // One day, in seconds.
query.findObjectsInBackgroundWithBlock {
(categories: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
for abstractCategory in categories {
let category = abstractCategory as PSCategory
NSLog("Category Name: %@", category.Name)
}
} else {
NSLog("Unable to retrieve categories from local cache or network")
}
}
Parse建議使用initialize()而不是load()
class Armor : PFObject, PFSubclassing {
override class func initialize() {
var onceToken : dispatch_once_t = 0;
dispatch_once(&onceToken) {
self.registerSubclass()
}
}
static func parseClassName() -> String! {
return "Armor"
}
}
從2015年4月27日發布的v1.7.2開始,PFSubclassing目前在Swift中無法正常工作。
我能夠通過實現屬性的自定義getter和setter作為臨時解決方法來實現它 - 這在某種程度上違背了目的,但至少這種方法只會在PFSubclassing為Swift做好准備后才會進行微小的重構。
沒有必要將#import <Parse/PFObject+Subclass.h>
到橋接頭。 但是,如PFSubclassing Protocol Reference中所示,“ Warning: This method must be called before [Parse setApplicationId:clientKey:]
之前調用Warning: This method must be called before [Parse setApplicationId:clientKey:]
”,您應該在調用Parse.setApplicationId(_:, clientKey:)
之前注冊所有PFObject自定義子類。
這是一個名為PFChatLOCMessage的自定義PFObject子類的示例:
// In ProjectName-Bridging-Header.h
#import <Parse/Parse.h>
// In AppDelegate.swift
@UIApplicationMain
final class AppDelegate: UIResponder, UIApplicationDelegate {
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
configureParse()
return true
}
func configureParse() {
registerParseSubclasses()
Parse.setApplicationId("...", clientKey: "...")
}
func registerParseSubclasses() {
PFChatLOCMessage.registerSubclass()
}
}
// In PFChatLOCMessage.swift
private let PFChatLOCMessageClassName = "PFChatLOCMessage"
private let userKey = "user"
class PFChatLOCMessage: PFObject {
var user: PFUser! {
get { return self[userKey] as! PFUser }
set { self[userKey] = newValue }
}
override init() {
super.init()
}
override init(user: PFUser) {
super.init()
self.user = user
}
}
extension PFChatLOCMessage: PFSubclassing {
class func parseClassName() -> String {
return PFChatLOCMessageClassName
}
}
我使用override class func initialize
得到了死鎖/掛起 - 盡管在解析文檔中建議這樣做。
考慮到它,在類的init方法中進行線程化並不是一個好主意 - 你永遠不知道這些可能被調用的時間或內容。
這對我有用 - 對於我所有的自定義子類,在我調用parse init方法之前,我將它們顯式注冊為子類。
通過這種方式,可以很好地定義調用事物的順序。 此外,它適用於我;)
MyPFObjectSubclass.registerSubclass()
MyPFObjectSubclass2.registerSubclass()
MyPFObjectSubclass3.registerSubclass()
// etc...
let configuration = ParseClientConfiguration {
$0.applicationId = "fooBar"
$0.server = "http://localhost:1337/parse"
}
Parse.initializeWithConfiguration(configuration)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.