如何使用隐式调用的委托方法避免同步请求(parse + swift)

时间:2015-07-29 17:52:18

标签: ios swift parse-platform

通常,如果我依赖于解析请求的结果,我将在请求的成功块中调用需要它们的函数,如下所示:

query?.getFirstObjectInBackgroundWithBlock({
(object:PFObject?,error:NSError?) in
    if error == nil{
        var image = (object as! PFUser).avatarImage
        ATLIncomingMessageCollectionViewCell.appearance().avatarImageView.image = image
        completion(data:image) 
    }   
})

然而,在这种情况下,我正在使用消息框架(Layer + Atlas),当我点击tableview中的对话时,我的问题就出现了。为了加载对话的自定义用户头像,我必须为有问题的用户查询Parse。

以下是我点击对话时设置头像的委托功能:

func conversationListViewController(conversationListViewController: ATLConversationListViewController!, avatarItemForConversation conversation: LYRConversation!) -> ATLAvatarItem! {

    var query = LYRQuery(queryableClass: LYRMessage.self)
    query.predicate = LYRPredicate(property: "conversation", predicateOperator: LYRPredicateOperator.IsEqualTo, value: conversation)
    var messages:NSOrderedSet = self.layerClient.executeQuery(query, error: nil)
    var message = messages.lastObject as! LYRMessage
    var participantID = message.sender.userID
    if(appdelegate.layerClient.authenticatedUserID != participantID)
    {
        var object:PFUser = PFUser(withoutDataWithObjectId: participantID)
        object.fetchIfNeeded()
        return object
    }
    return PFUser.currentUser() as? ATLParticipant
}

以下是我的ATLParticipant的样子(没有一些无关的代码):

extension PFUser: ATLParticipant {

    public var participantIdentifier: String {
        return self.objectId!
    }

    public var avatarImage: UIImage? {
        let image = (self.valueForKey("profilePictureLarge") as! PFFile)
        var mainImage = UIImage(data:image.getData()!)
        return mainImage
    }
}

问题是同步请求getData()和fetchIfNeeded()阻塞主线程并冻结UI直到完成。从设计的角度来看,这显然很糟糕,但我不确定是否有办法绕过它。

更清楚地表达问题:

1)我点击一个对话,我的tableview的委托方法获取有关对话的信息。然后在不同的视图控制器中打开对话。

2)必须从Parse中检索一些所需的信息,但是如果没有同步请求,我无法等待委托方法返回。

3)我不知道手动设置数据的方法,否则我只会使用占位符并在后台设置真实数据。

4)我可以预加载我需要的所有信息,但如果有多个用户,这将变得非常不切实际,所以我真的需要动态获取它。

我确信必须有一个明显的解决方案,但我仍然非常擅长iOS编程。

0 个答案:

没有答案