PFQueryTableView queryForTable(), как ничего не вернуть?

Я только начал использовать Parse, и иногда у меня возникают проблемы. У меня есть PFQueryTableView, который отлично работает, когда пользователь вошел в систему. Функция queryForTable() запрашивает все объекты, которые имеют имя пользователя текущего пользователя в столбце «createdBy». Но если ни один пользователь не вошел в систему, что мне тогда вернуть? На данный момент у меня так, что работает, но выдает ошибку в Логе. После того, как пользователь вошел в систему, вы должны потянуть, чтобы обновить таблицу, затем она показывает события пользователей. Я хотел бы иметь пустую таблицу, когда ни один пользователь не вошел в систему, и после того, как пользователь вошел в систему, а loginView исчез, таблица должна автоматически загружать данные пользователей. Вот мои функции viewDidAppear и queryForTable:

override func viewDidAppear(animated: Bool) {

    if PFUser.currentUser() == nil {
        let loginView = PFLogInViewController()
        loginView.delegate = self
        self.presentViewController(loginView, animated: true, completion: nil)



    }

}


override func queryForTable() -> PFQuery {

    if PFUser.currentUser() != nil{

            let query = PFQuery(className: "calendarEvents")
            query.cachePolicy = .CacheElseNetwork
            query.orderByAscending("StartDate")
            query.whereKey("createdBy", equalTo: (PFUser.currentUser()?.username)!)
            return query
   }else{
        let noQuery = PFQuery()

        return noQuery
    }


}

person beginner_T    schedule 07.12.2015    source источник


Ответы (1)


Подход, который вы выбрали, хорош. Более распространенный подход — даже не представлять этот VC, пока у приложения не появится пользователь. Вы также можете добавить всех пользователей к какой-либо роли, а затем защитить свой класс «calendarEvents» с помощью CLP, который ссылается на эту роль.

Другая идея в запросе состоит в том, чтобы добавить квалификатор, гарантирующий пустой результат, например...

override func queryForTable() -> PFQuery {
    let query = PFQuery(className: "calendarEvents")
    query.cachePolicy = .CacheElseNetwork
    query.orderByAscending("StartDate")
    query.whereKey("createdBy", equalTo: (PFUser.currentUser()?.username)!)

    if PFUser.currentUser() == nil {
        query.whereKey("createdAt", greaterThan: NSDate.distantFuture())  // return objects created after the universe has collapsed
    }
    return query
}
person danh    schedule 07.12.2015
comment
спасибо за Ваш ответ! Поскольку я только начал программировать и изучать все это сам, я не получил всего вашего ответа :D Я хочу, чтобы этот VC был как точка входа в мое приложение, так как же можно не показывать его, если нет пользователь вошел в систему, но показать его, когда пользователь вошел в систему? И, честно говоря, я не знаю, что означает все последнее предложение :D извините, что такое CLP и как с его помощью защитить роль? Вам не обязательно отвечать на все это, также хорошо, если вы, возможно, знаете несколько веб-сайтов, где я могу узнать об этом. - person beginner_T; 07.12.2015
comment
Попался. Извиняюсь. В первой идее vc в вашем вопросе не будет точкой входа. Вместо этого начальный vc будет очень простым: его пользовательский интерфейс будет просто говорить «Привет», и все, что он будет делать, это проверять пользователя и либо представлять vc для входа, либо ваш вопрос vc. Вторая идея больше связана с безопасностью (вам, вероятно, следует ознакомиться с документацией по разбору (parse.com). /docs/ios/guide#security). Идея состоит в том, что вы можете настроить безопасность, которая позволит только пользователям, которым вы предоставили права, видеть любой объект или набор объектов (это особенно важно для веб-приложений, чьи ключи в открытой) - person danh; 07.12.2015
comment
Хорошо, спасибо большое!! Я проверю документы для получения дополнительной информации и добавлю комментарий, если у меня возникнут дополнительные вопросы. Еще раз спасибо за помощь! - person beginner_T; 07.12.2015
comment
Я также должен подчеркнуть этот момент: пустой запрос, который вы возвращаете, достаточно хорош для начала. - person danh; 07.12.2015
comment
Хорошо, для меня много значит, что вам нравится это решение, которое я придумал сам. Хотя меня немного раздражает, что выдает ошибку, хотя приложение по-прежнему работает отлично. И это довольно плохо, что пользователю приходится тянуть, чтобы обновить tableView, чтобы увидеть свои данные. Есть ли способ, чтобы после успешного входа в систему и исчезновения loginView PFQueryTableView автоматически перезагружался? Надеюсь, вы поняли, что я имею в виду :D - person beginner_T; 07.12.2015
comment
Не знал, что вы видите ошибку. Попробуйте вернуть ноль. [self loadObjects] — это то, как вы программно обновляете. - person danh; 07.12.2015
comment
Идеальный!! loadObjects сделал свое дело ;) Я уже пытался вернуть nil, он мне не позволяет. Он говорит, что nil несовместим с возвращаемым типом PFQuery. На данный момент я получаю эту ошибку: [Ошибка]: неверные символы в имени класса: (null) (Код: 103, Версия: 1.8.5) .... Но все работает идеально и так, как я хотел, поэтому я могу просто игнорировать эта ошибка? :D - person beginner_T; 07.12.2015
comment
Хм, а как насчет оператора let query = ..., который вы используете, когда есть пользователь, но устанавливаете его лимит = 0?? - person danh; 07.12.2015
comment
К сожалению, это не работает, я подумал о том, чтобы создать запись в моем классе Parse, например запись по умолчанию, которая загружается, когда ни один пользователь не вошел в систему. Как вы думаете, это хорошая идея? - person beginner_T; 07.12.2015
comment
Как насчет уточнения запроса, чтобы он обязательно возвращал пустой результат? (отредактировано для иллюстрации... вам может понадобиться настроить синтаксис, так как мой Swift довольно грубый). - person danh; 07.12.2015