首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >locationManager与数据管理

locationManager与数据管理
EN

Stack Overflow用户
提问于 2015-11-13 19:39:25
回答 2查看 102关注 0票数 0

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

代码语言:javascript
复制
    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的方法:

代码语言:javascript
复制
    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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-20 11:14:28

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

票数 0
EN

Stack Overflow用户

发布于 2015-11-14 21:17:39

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33700568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档