locationManager和数据管理

时间:2015-11-13 19:39:26

标签: json swift asynchronous ibeacon alamofire

我正在编写一个应用程序来扫描iBeacon设备,并使用Alamofire和SwiftyJSON从与信标相关的数据库数据中获取。我的问题是设备每秒扫描一次,我想保持信标的实际桌面视图在范围内。例如,当我在同一时间丢失几个信标时,我得到了数组索引超出边界错误。

    func locationManager(locationManager: KTKLocationManager!, didRangeBeacons beacons: [AnyObject]!) {
    let knownBeacons = beacons.filter{ $0.proximity != CLProximity.Unknown }
    let group = dispatch_group_create()

    dispatch_group_enter(group)
    deleteFromFoundBeacons(knownBeacons)
    dispatch_group_leave(group)

    dispatch_group_notify(group, dispatch_get_main_queue(), {
        if (knownBeacons.count > 0) {
            self.addToFoundBeacons(knownBeacons)
        }
    })

    tableView.reloadData()
}

    func addToFoundBeacons(knownBeacons: [AnyObject]!) {
    for i in 0..<knownBeacons.count {
        var isOnList = false
        let foundBeacon = knownBeacons[i] as! CLBeacon
        for j in 0..<Equipments.count {
            if (knownBeacons[i].minor == Equipments[j].minor) {
                isOnList = true
            }
        }
        if (isOnList == false) {
            httpProtocol.makeGetRequestForEquipment(foundBeacon.minor) { equipment in
                if let equipment = equipment {
                    self.Equipments.append(equipment)
                }
            }
        }
    }
}

func deleteFromFoundBeacons(knownBeacons: [AnyObject]!) {
    for i in 0..<Equipments.count {
        var isToDelete = true
        for j in 0..<knownBeacons.count {
            if (knownBeacons[j].minor == Equipments[i].minor) {
                isToDelete = false
            }
        }
        if (isToDelete) {
            Equipments.removeAtIndex(i)
        }
    }
}

向设备添加新信标(和tableview)可正常工作,但当任何信标离开扫描范围时,错误就会显示出来。我的问题是如何从每秒调用的locationManager函数中独立进行信标管理?

这些是tableView的方法:

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return Equipments.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("EquipmentTableViewCell", forIndexPath: indexPath) as! EquipmentTableViewCell

    let equipment = Equipments[indexPath.row]

    cell.equipmentLabel.text = equipment.name
    cell.equipmentPhoto.image = equipment.photo

    return cell
}

2 个答案:

答案 0 :(得分:1)

我怀疑你得到了异常,因为deleteFromFoundBeacons中的代码正在从遍历它的循环内的数组中删除一个项目。你不能这样做。您可能需要使用所需的信标构造一个新数组,然后在最后用新数组替换旧数组。

答案 1 :(得分:0)

通过在主循环的每次迭代之前添加另一个if语句来检查i < Equipments.count中是否deleteFromFoundBeacons来解决问题。多亏了它,我还摆脱了locationManager中的派遣部分。我还将tableView.reloadData()更改为beginUpdates() - endUpdates()个部分,以便在每次扫描中动态管理表格。