Swift: динамическая переменная подкласса Parse не включается при извлечении объекта

Я не могу получить свойства объекта при извлечении объекта из Parse Data Browser. Это произошло после того, как я перешел с "@NSManaged var friends" на "динамические var friends". Даже «имя» показывает ноль в блоке User.logInWithUsernameInBackground, что безумно, потому что вход в систему выполнен успешно. ACL для пользователя настроен на «общедоступное чтение».

Пользовательский объект:

class User : PFUser, PFSubclassing {

    dynamic var friends:[User]!
    dynamic var name:String!

     override class func load() {
        self.registerSubclass()
    }
}

Получение пользователя вместе с друзьями. println показывает ноль

var query = User.query()
query.includeKey("friends")
query.getObjectInBackgroundWithId(currentUser.objectId) {
    (pfObject: PFObject!, error: NSError!) -> Void in
    if pfObject != nil {
        var user = pfObject as User
        var friends = user.friends as [User]
        println("friends: \(friends)") //nil
   } else {
        println(error)
   }
}

Авторизоваться. println показывает ноль

User.logInWithUsernameInBackground(USERNAME, password:PASSWORD) {
        (user: PFUser!, error: NSError!) -> Void in
        if user != nil {
            println("Logged in with user: \(user.name)") //nil
        } else {
            println(error)
        }
    }

person rilar    schedule 08.09.2014    source источник
comment
Почему вы отказались от @NSManaged? Просто для справки, у вас есть ссылка на что-то, что предлагает это сделать?   -  person ccwasden    schedule 08.09.2014
comment
Спасибо за ответ ccwasden. Возможно, я неправильно понял, но @NSManaged, похоже, используется только для основных данных: rel="nofollow noreferrer">developer.apple.com/library/prerelease/mac/documentation/Swift/   -  person rilar    schedule 08.09.2014
comment
Согласно этому сообщению, подклассы синтаксического анализа нуждаются в @NSManaged stackoverflow.com/questions/ 24581981/   -  person ccwasden    schedule 08.09.2014
comment
Я тоже читал это, и да, может быть, тогда это так, просто кажется странным. спасибо!   -  person rilar    schedule 08.09.2014


Ответы (2)


Глядя немного глубже, кажется, что препятствием является непонимание того, что делает модификатор dynamic в Swift. По-видимому, dynamic в Swift используется для наблюдения за значением ключа, а не для объявления методов доступа к переменной, которые должны быть определены во время выполнения (что делает @dynamic в Objective-C)

См. здесь описание dynamic в Swift https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-XID_8

и это для описания того, почему @NSManaged работает так, как @dynamic работает в Objective-C CBehavior.html#//apple_ref/doc/uid/TP40014216-CH5-XID_66">https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WritingSwiftClassesWithObjective-CBehavior.html#/ /apple_ref/doc/uid/TP40014216-CH5-XID_66

person ccwasden    schedule 08.09.2014
comment
Спасибо! Тогда я буду придерживаться @NSManaged! ;) - person rilar; 08.09.2014

С xCode 6.1.1 я смог заставить это работать без заголовка моста, но мне нужно было использовать @NSManaged. Вот как... Просто:

import Parse 

в верхней части вызывающего модуля. Для объявления класса. Динамический файл .swift не работал, поэтому мне нужно было использовать @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")
    }
}
person Timothy Tripp    schedule 03.01.2015