我正在编写一个应用程序来扫描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
}
答案 0 :(得分:1)
我怀疑你得到了异常,因为deleteFromFoundBeacons
中的代码正在从遍历它的循环内的数组中删除一个项目。你不能这样做。您可能需要使用所需的信标构造一个新数组,然后在最后用新数组替换旧数组。
答案 1 :(得分:0)
通过在主循环的每次迭代之前添加另一个if语句来检查i < Equipments.count
中是否deleteFromFoundBeacons
来解决问题。多亏了它,我还摆脱了locationManager
中的派遣部分。我还将tableView.reloadData()
更改为beginUpdates() - endUpdates()
个部分,以便在每次扫描中动态管理表格。