distanceInMeters数组和排序的问题

时间:2016-12-14 17:19:23

标签: ios arrays swift uitableview

我想按距离排序我的TableView,但我已经混淆了:(请帮助我,如果可以,我会很感激,真的:(

我有一个包含100个对象的数组。

var malls: [Mall] = [

    Mall(name: "Европейский",  type: "торговый центр", image: "europe.jpg", time: "с 10.00 до 22.00",
         timeWeek: "с 10.00 до 23.00", city: "Москва", location: "Киевская",
         adress: "г. Москва, Киевского вокзала площадь, д.2", cinemaName:"formulakino.png",
         productName: "perekrestok.png", numShop: "309", website: "http://europe-tc.ru", schemeWeb:"http://www.europe-tc.ru/shops/", longitude:37.566, latitude:55.745),

    Mall(name: "Золотой Вавилон Ростокино",  type: "торговый центр", image: "vavilon.jpg", time: "с 10.00 до 22.00",
         timeWeek: "с 10.00 до 22.00", city: "Москва", location: "Проспект Мира",
         adress: "г. Москва, Проспект Мира, д. 211", cinemaName: "Люксор",
         productName: "okay.png", numShop: "280", website: "http://zolotoy-vavilon.ru/rostokino", schemeWeb:"http://www.zolotoy-vavilon.ru/rostokino/map", longitude:37.663, latitude:55.846), ]

等等......对不起西里尔语

并在覆盖func tableView之后我有了这个

func locationManager(_  manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{


    let currentLocation = locations[0]


    if (currentLocation.horizontalAccuracy > 0 ) {
        locationManager.stopUpdatingLocation()
        let coords = CLLocation(latitude: currentLocation.coordinate.latitude, longitude: currentLocation.coordinate.longitude)
        **let mallLocate = CLLocation(latitude: mall.latitude, longitude: mall.longitude)**
        let distanceInMeters = mallLocate.distance(from: coords)
        print (distanceInMeters)
    }

}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! EateriesTableViewCell
    let mall = mallToDisplayAt(indexPath: indexPath)
    cell.thumbnailImageView.image = UIImage(named: mall.image)
    cell.thumbnailImageView.clipsToBounds = true
    cell.nameLabel.text = mall.name
    cell.locationLabel.text = mall.location
    cell.typeLabel.text = mall.time


    return cell

}

我在这一行有问题

let mallLocate = CLLocation(latitude: mall.latitude, longitude: mall.longitude)

使用未解析的标识符'mall'

我该如何解决?以及如何按指示排序?非常感谢你。

3 个答案:

答案 0 :(得分:0)

您必须选择数组的索引:

let mallLocate = CLLocation(latitude: malls[0].latitude, longitude: malls[0].longitude)

答案 1 :(得分:0)

  

使用未解析的标识符' mall'

=>函数locationManager didUpdateLocations的范围内没有任何名为" mall" 的内容。含义:locationManager didUpdateLocations不清楚tableView cellForRowAt indexPath内部发生了什么,反之亦然。

您可以通过对代码应用以下步骤来解决此问题:

  1. 从中移动距离计算 locationManager didUpdateLocations

    tableView cellForRowAt indexPath
  2. 在您的类中添加一个存储当前位置的属性:
    var currentPosition: CLLocation? = nil

  3. 将您在locationManager didUpdateLocations收到的职位存储到currentPosition媒体资源

  4. 收到并分配职位后添加self.tableView.reloadData()
  5. 使用mallcurrentPosition中的cellForRowAt计算距离并更新distanceLabel
  6. 请注意,currentPosition可以nil且距离无法计算=>使标签为空或添加类似"未知距离"对它

答案 2 :(得分:0)

听起来你想根据他们与用户当前位置的距离来对商场阵列进行排序。

我建议您在Mall对象中添加var distanceToUser。 (使其成为可选的双倍)

locationManager.didUpdateLocations()中,遍历商场数组并使用CLLocation distance(from:)函数计算从新用户位置到每个商城的距离,并将该值存储在每个商城的distanceToUser财产。

填充商城数组的distanceToUser属性后,可以按该属性对数组进行排序。最后,调用表视图的reloadData()方法。编写tableView(cellForRowAt:)方法以现有的数组顺序显示单元格。

在商城对象中包含距离属性的原因是性能。用于计算2点之间距离的位置管理器功能实际上有点耗时(为了在地球表面上进行精确计算,必须进行3D触发。)你想避免一遍又一遍地计算距离值。相反,通过批量计算到新更新位置的距离,排序可以将距离值视为已知常量,当位置发生变化时,每个Mall对象计算一次。

如果您有很多商城对象,您可能需要在后台线程中进行距离计算,然后在计算完成后调用主线程重新加载表视图,但是您可以编写计算代码来运行如果在位置更新时发现UI滞后,则主线程然后返回并重构它。

您还需要将位置管理器配置为仅在相当大的数量更改时更新当前位置。要么是这个,要么放入将新位置与旧位置进行比较的代码,只有在距离变化足以影响Malls数组的排序顺序时才重新排序malls数组。 (在最高灵敏度读数时,位置管理器会为您提供几乎恒定的微小位置变化流,这意味着您将重新计算距离并不断重新排序您的Malls阵列。)