我目前正在尝试对从Parse.com收到的PFObject进行排序,并将它们区分在'附近。和远在'远。到目前为止,我能够将这些对象放在元组中
var placesID = [(姓名:" PlaceName"),(距离:双倍)]
我遇到的问题是区分这些对象(基于距离)并将它们附加到单独的数组(nearArray& farArray)的过程。
我正在处理的主要问题是元组是从Parse一次加载的。因此,第一次迭代将是
[(姓名:地点A,距离:10)]
接着是
[(姓名:地点A,距离:10),(姓名:地方B,距离:20)]
依赖于我在Parse中存储的位置数量。
由于有多次迭代,我目前通过 -
区分对象的方法 for x in self.PlacesID {
if x.Distance < 15 {
self.nearPlacesID.append(x)
}
}
不能作为具有名称的对象&#34;放置A&#34;多次迭代并能够满足距离约束。因此,&#34;放置A&#34;在nearPlacesID元组中多次附加。我想知道是否有方法等待所有PFObjects加载之前它根据距离区分所有对象。或者,如果有任何其他方法来解决问题,我将不胜感激。
这是我目前的代码。
var placesID: [(Name: String?, Distance: Double?, Image: UIImage?)] = []
var nearplacelID: [(Name: String?, Distance: Double?, Image: UIImage?)] = []
var farplaceID: [(Name: String?, Distance: Double?, Image: UIImage?)] = []
override func viewDidLoad() {
super.viewDidLoad()
var query = PFQuery(className: "VenueData")
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INTERACTIVE.value), 0)){
let object = query.findObjects() //Get the Object
PFGeoPoint.geoPointForCurrentLocationInBackground({ (userLocation: PFGeoPoint?, error: NSError?) -> Void in //Get User Location
if let myObject = object as? [PFObject] {
for x in myObject {
var name = x.objectForKey("Name") as? String
var location = x.objectForKey("Location") as? PFGeoPoint
var distance = location?.distanceInKilometersTo(userLocation)
var File: PFFile? = x.objectForKey("ImageFile") as? PFFile
File?.getDataInBackgroundWithBlock({ (imagedata: NSData?, error: NSError?) -> Void in
var image = UIImage(data:imagedata!)
self.placesID += [(Name:name, Distance: distance, Image: image)]
self.tableView.reloadData()
for x in self.placesID {
if x.Distance < 1 {
self.nearplaceID.append(x)
}
}
for x in self.placesID {
if x.Distance > 1 && x.Distance < 10 {
self.farplaceID.append(x)
}
}
})
}
}
})
}
}
答案 0 :(得分:0)
你可以尝试将你的数组转换为NSArray并使用containsObject方法
for x in self.PlacesID {
if !(self.nearPlacesID as NSArray).containsObject(x) {
if x.Distance < 15 {
self.nearPlacesID.append(x)
}
}
答案 1 :(得分:0)
你遇到问题的原因是因为你有一个双循环。因此,每次下载对象时,都会检查到目前为止下载的所有对象是远还是远。并再次检查每一个。由于您已经处于循环中,因此无需再创建另一个循环。只需检查一个物体是否接近即可。
所以,您的代码应该是:
if x.distance < 1{
self.nearPlace.append(x)
}
else if x.distance < 10{
self.farPlace.append(x)
}
(注意,在你的双循环中,你使用变量x
作为循环变量。在同一范围内声明两个具有相同名称的变量似乎不太安全。但是尽管如此,不需要内部循环。用上面的代码替换它。)