加载数据和不重复追加

时间:2015-07-29 03:49:26

标签: swift for-loop parse-platform tuples

我目前正在尝试对从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)
                        }
                    }


                })

            }


    }


    })


    }
   }

2 个答案:

答案 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作为循环变量。在同一范围内声明两个具有相同名称的变量似乎不太安全。但是尽管如此,不需要内部循环。用上面的代码替换它。)