2015-09-09 2 views
2

У меня есть странная проблема с доступом к полям-членам с использованием точечной нотации. Пример:Проанализируйте «непризнанный селектор, отправленный экземпляру» при доступе к членам PFObject

SettingsModel

class SettingsModel: PFObject, PFSubclassing { 

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

    static func parseClassName() -> String { 
     return "Settings" 
    } 

    @NSManaged var name:String 
    @NSManaged var code:String 
    @NSManaged var friend:FriendsModel 

} 

FriendsModel

class FriendsModel: PFObject, PFSubclassing { 

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

    static func parseClassName() -> String { 
     return "Friends" 
    } 

    @NSManaged var user:PFUser 
    @NSManaged var settings:SettingsModel 
} 

Когда я пытаюсь получить доступ к друзьям Имя с помощью mySettings.friend.settings.name Я получаю непризнанный селектор на "Настройки".

Но достаточно интересно, когда я использую (mySettings.friend["settings"] as SettingsModel).name, он работает. Я намеренно пропустил все условные разворачивания и т. Д. - У меня есть действительный PFObject нужного типа со всеми данными ...

Я уверен, что это что-то тривиальное, но не может понять это. Любая помощь будет оценена по достоинству. Использование Parse 1.8.2.

+0

Не могли бы вы дать нам больше контекста? Как и все объявления класса? –

+0

Вы имеете в виду классы моделей? Они являются стандартными шаблонами подкласса Parse, но я все равно добавил их. Cheers – Tom

+0

@Tom Вы выяснили, в чем проблема? Я столкнулся с той же проблемой. – otusweb

ответ

3

Похоже, что FriendsModel не был успешно зарегистрирован в качестве подкласса Parse, несмотря на то, что вы использовали PFSubclassing. Это может быть так, что initialize()FriendsModel еще не вызывается при доступе к нему через mySettings.friend.settings.name.

Для решения этой проблемы вы можете зарегистрировать свой подкласс FriendsModel ранее с помощью Парса, позвонив по телефону FriendsModel.registerSubclass(), непосредственно перед адресом, где вы звоните Parse.setApplicationId(..).

Так я сам решил эти проблемы, надеюсь, это поможет и в вашем случае.

+0

Я подозревал, что это может быть проблема изначально, поэтому я добавили SettingsModel.initialize() и FriendsModel.initialize() как самое первое, что было в AppDelegate. Но увы не помогли. – Tom

+1

метод registerSubclass() работал для меня и решал проблему :) – user4478383

+0

У меня такая же проблема, я определенно вызываю [MyClass registerSubclass] и даже пытаюсь переустановить ее, чтобы убедиться, что класс, который вложен, сначала зарегистрирован что вызывает проблему. Хотя ключевой аксессуар работал для меня, чтобы обойти проблему на данный момент. –

0

У меня нет ответа, почему это происходит, но я использую обходное решение, которое немного чище в моем сознании, поскольку обходной путь находится только в одном месте. А именно использование функции setter и getter для swift.

class SettingsModel: PFObject, PFSubclassing { 

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

static func parseClassName() -> String { 
    return "Settings" 
} 

@NSManaged var name:String 
@NSManaged var code:String 
var friend:FriendsModel 
    { 
     get 
     { 
      return self["friend"] as! FriendsModel 
     } 
     set 
     { 
      self["friend"] = newValue 
     } 
    } 

} 
+0

Хорошее мышление, спасибо! – Tom

0

ничего себе ... Я думаю, что нашел причину вашей проблемы, но это будет один из тех «как в аду, это может быть причиной» типа решений. Я наткнулся на этот поток, потому что получил такое же сообщение об ошибке, и я почти в подобной среде (parse, subclassing, swift). Линия, где мое приложение разбился был один:

let setOpts = self.thing?.settingOptions

, где переменная «вещь» представляет собой PFObject, а также «settingOptions». Поэтому я подумал, что, возможно, это также проблема ложно зарегистрированных подклассов, хотя я думаю, что это не нужно больше в последних версиях Parse (я использую v1.15.1). Во всяком случае, обходной путь вы обеспечили помогли в первый, но сделал мой крах приложения на этой следующей строке:

if (self.thing?.setting != nil) {...} 

, а затем он заставил меня думать ... постойте ... есть несколько других свойств «вещи «доступ через точную нотацию, между которой не сбой, так зачем же здесь ?! Когда я вернулась на свой пост, он ударил меня прямо в лицо. Я надеюсь, что каждый видит его сейчас, потому что вы не можете верить мне, если я вам скажу ... но я буду в любом случае:

Свойства мы используем все начинаются с установки.

И это похоже на это. Я не знаю, не следует ли начинать с «set» или «setti», но определенно не с «настройкой». Как только я сменил имя на нечто совершенно другое, он сработал. Возможно, имя класса также имеет значение, но мой начинается с префикса, поэтому «настройка» является только частью имени. Надеюсь, это поможет;)