【发布时间】:2017-11-22 21:21:36
【问题描述】:
我正在尝试在 xcode 中构造一个解析查询,该查询采用通过前一个 segue 传递给视图控制器的对象数组,从这些对象创建一个 objectId 数组,并查询数组 objectId 中的完全匹配“MessageThread”类中的键“参与者”中的值
我一直在阅读解析文档,我能想到的最佳查询是 containsAllObjectsIn:
显然, containsAllObjectsIn 在某些情况下会起作用。但是,该查询仅检查键“参与者”中是否存在所有 objectId。它不检查数组是否相同。因此,查询将返回对象,虽然它们确实包含所有 objectId,但可能包含额外的 objectId。
为了抵消这种负面影响,我对每个返回的对象进行检查,以查看返回对象中的 objectIds 是否与原始数组相同。我在下面包含了视图控制器代码。
虽然我目前在下面解决的代码似乎在测试后按预期工作,但我不禁知道必须有一种更有效的方法来通过 PFQuery 检查数组是否相同。
关于如何使这段代码更好的任何想法或帮助?谢谢。
import UIKit
import Parse
class MessageThreadViewController: UIViewController {
@IBOutlet weak var sendNewMessageButton: UIButton!
var participantsList:[PFObject] = []
var participantsListIds:[String] = []
var currentMessageThreadObject:PFObject?
var threadMessages:[PFObject] = []
override func viewDidLoad() {
super.viewDidLoad()
initialViewSetup()
checkForExistingMessageThread()
}
func initialViewSetup() {
sendNewMessageButton.isEnabled = false
for participant in participantsList {
participantsListIds.append(participant.objectId!)
}
}
func checkForExistingMessageThread () {
print("-------------------")
print(participantsListIds)
let query = PFQuery(className: "MessageThread")
query.whereKey("participants", containsAllObjectsIn: participantsList)
query.includeKey("messages")
query.findObjectsInBackground(block: { (threads, error) in
if error != nil {
if let error = error {
print(error)
}
} else {
if let threads = threads {
if threads.isEmpty {
print("no thread found. creating thread....")
self.createMessageThread()
} else {
print("existing thread match(es) found")
var activeThreadFound = false
for thread in threads {
let returnedThreadParticipants = thread["participants"] as! [PFObject]
var returnedThreadParticipantsIds:[String] = []
for participant in returnedThreadParticipants {
returnedThreadParticipantsIds.append(participant.objectId!)
}
if returnedThreadParticipantsIds.containsSameElements(as: self.participantsListIds) {
activeThreadFound = true
print("thread identical match found")
self.currentMessageThreadObject = thread
self.sendNewMessageButton.isEnabled = true
if let queriedThreadMessages = thread["messages"] {
let queriedThreadMessagesAsObjects = queriedThreadMessages as! [PFObject]
self.threadMessages = queriedThreadMessagesAsObjects
self.messagesTableView.reloadData()
self.sendNewMessageButton.isEnabled = true
}
break
} else {
print("non-identical thread found")
}
}
if activeThreadFound == false {
print("matches were found, but no identical thread. Creating thread....")
self.createMessageThread()
}
}
}
}
})
}
func createMessageThread() {
let newMessageThread = PFObject(className:"MessageThread")
newMessageThread["participants"] = participantsList
newMessageThread.saveInBackground(block: { (success, error) in
if error != nil {
if let error = error {
print(error)
}
} else {
self.checkForExistingMessageThread()
}
})
}
}
extension Array where Element: Comparable {
func containsSameElements(as other: [Element]) -> Bool {
return self.count == other.count && self.sorted() == other.sorted()
}
【问题讨论】:
标签: swift parse-platform