Пользовательское соединение PFQuery и PFObject в Swift 2.0

Я создал собственный класс для PFQuery и PFObject, где я просто наследую / расширяю эти классы, чтобы не беспокоиться об импорте Parse везде, где я использую запрос или объект.

Однако я столкнулся с проблемой при попытке смешать PFQuery и PFObject вместе с их настраиваемым классом.

Вот мои пользовательские классы, которые теоретически должны теперь иметь те же свойства и эффекты, что и PFObject и PFQuery, что они и делают в большинстве случаев.

class CustomQuery: PFQuery {
    override init(className:String) {
        super.init(className: className)
    }
}

class CustomObject: PFQbject {
    override init(className:String) {
        super.init(className: className)
    }
}

Но я столкнулся с проблемой при попытке использовать функцию "..InBackgroundWithBlock" из запроса. Вот код:

func GetAsyncObjects(query:CustomQuery, closure: (dataObjects:[CustomObject]) -> ()) {
    query.findObjectsInBackgroundWithBlock {(returnedObjects:[CustomObject]!, error:NSError?) -> Void in
        closure(dataObjects: returnedObjects!)
    }
}

Ошибка возникает во второй строке вышеприведенного блока, в "ReturnObjects: [CustomObject]!" со следующей ошибкой:

Невозможно преобразовать значение типа '([CustomObject] !, NSError?) -> Void »в ожидаемый тип аргумента« PFQueryArrayResultBlock? »

Я буквально не могу найти решение для этого. Очевидно, изменение CustomObject на PFObject будет работать, но это делает весь смысл моих CustomObject и CustomQuery устаревшим.

Спасибо!


person Kevin Jensen Petersen    schedule 17.12.2015    source источник


Ответы (1)


Вероятно, это не основная проблема, а ваши CustomObject подклассы из PFQbject (обратите внимание, что вместо «O» стоит буква «Q»). Также вам нужно будет использовать PFObject в закрытии внутри функции GetAsyncObjects, потому что сигнатура блока предполагает, что возвращаемые объекты будут типа [PFObject]?. Вы можете обойти проблему, сделав что-то вроде этого:

// in CustomQuery class
func GetAsyncObjects(closure: (dataObjects:[CustomObject]) -> ()) {
    self.findObjectsInBackgroundWithBlock {(returnedObjects:[PFObject]?, error:NSError?) -> Void in
        // explicitly cast to your custom object
        closure(dataObjects: returnedObjects as! [CustomObject])
    }
}

Итак, чтобы закрытие вернуло массив из CustomObjects, вы можете просто преобразовать данные [PFObject]?, полученные из Parse, в желаемый тип массива, в данном случае [CustomObject].

person the_critic    schedule 17.12.2015
comment
Он делает свое дело, но опять же, я хотел избежать использования оператора Import Parse где-либо еще, кроме моих CustomQuery и CustomClass. Возможно ли это из-за предопределенной сигнатуры блока? И если это так, то почему бы и нет? Это PFObject в той же степени, что и собственно PFObject. - person Kevin Jensen Petersen; 17.12.2015
comment
@KevinJensenPetersen Если вы поместите функцию GetAsyncObjects в свой собственный запрос, вам не придется никуда импортировать ее ... - person the_critic; 17.12.2015
comment
Отличный момент. Не могу поверить, что не думал об этом. Вы, сэр, определенно заслуживаете принятого ответа! Спасибо! - person Kevin Jensen Petersen; 17.12.2015
comment
@KevinJensenPetersen Рад, что помог! Удачи тебе с твоим проектом! - person the_critic; 17.12.2015
comment
Вы можете использовать CustomObject в блоке завершения запроса, так как это подкласс PFObject. Ранее ошибка заключалась в том, что это было принудительное развертывание вместо необязательного CustomObject. Это нормально: findObjectsInBackgroundWithBlock {(returnedObjects:[CustomObject]?, error:NSError?) -> Void in - person Russell; 17.12.2015
comment
@Russell Я не думаю, что это правильно. findObjectsInBackgroundWithBlock ожидает, что PFResultBlock, который строго типизирован, будет использовать [PFObject]? в качестве первого параметра своего закрытия. Тот факт, что существует is-a отношение между PFObject и CustomObject, не обязательно означает, что подпись будет уважать это. - person the_critic; 18.12.2015
comment
@the_critic отличный улов! По какой-то причине я мог поклясться, что использовал подклассы объектов в блоке результатов запроса, но после быстрой проверки я полностью ошибаюсь. Спасибо за исправление. - person Russell; 18.12.2015
comment
@Russell Всегда хорошо, когда кто-то ставит под сомнение утверждения других, я тоже мог ошибаться. Цените ваш вклад! - person the_critic; 18.12.2015