通常,如果我依赖于解析请求的结果,我将在请求的成功块中调用需要它们的函数,如下所示:
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编程。