簡體   English   中英

解析PFSubclassing無法使用Swift

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM