繁体   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