NSPredicate在Swift中进行位置地理围栏

时间:2015-03-19 20:10:06

标签: ios json swift core-data

我是使用Swift进行iOS / xCode开发的新手。我正在尝试执行以下操作:

1)将lat / lon坐标与CoreData中的其他数据字段(机场位置,即:SFO,LAX等)一起存储为从JSON查询中提取的字符串(此任务完成)。

Entity Attributes and type:
apCode: String
apId: String
apLat: String
apLon: String
apName: String
apUpdate: Date

样本coredata结果:

<NSManagedObject: 0x7ff9db864bb0> (entity: Airports; id: 0xd000000000dc0000 <x-coredata://30BBE8C4-120C-4776-B565-618DA59AC7FA/Airports/p55> ; data: {
    apCode = SFO;
    apID = 6773;
    apLat = "-122.375";
    apLon = "37.618889";
    apName = "San Francisco International";
    apUpdate = "2015-03-19 09:59:23 +0000"; })

2)当用户打开应用程序时,我希望在应用程序确定其位置在该机场内或附近后,显示存储在CoreData中的机场特定信息。

3)我能够使用CoreLocation

确定用户的纬度/经度

我的问题是,如何使用NSPredicate过滤获取存储在CoreData中的那个特定机场?我尝试过以下方法:

var request = NSFetchRequest(entityName: "Airports")
request.predicate = NSPredicate(format: "apLat <= %@ AND apLat >= %@ AND apLon <= %@ AND apLon >= %@", maxLat, minLat, maxLon, minLon)

这要求我在获得用户的lat / lon时提供以下4个值(maxLat,minLat,maxLon,minLon)。甚至不确定如何偏移lat / lon来确定这些最大值和最小值 - 甚至在使用硬编码值时,也没有返回结果 - 可能是因为我将lat / lon坐标保存为String(这是另一个问题,因为我很难尝试将JSON中的lat / lon值保存为CoreData中的Double)

我在网上找到的另一个样本如下,我觉得这可能是正确的方法,但我不明白如何在NSPredicate中应用它:

var request = NSFetchRequest(entityName: "Airports")       
var radiusInKilometers:CGFloat = 1000
request.predicate = NSPredicate(format: "distanceToLocation:fromLocation:(location, %@) < %f", location, radiusInKilometers)!

第二种方法我想真正弄清楚如何应用,因为调整radiusInKilometers值来微调用户的位置会很有帮助

任何帮助肯定会受到赞赏 Octavious

我有一种感觉,我将Lat / lon的JSON结果保存到字符串的方法可能导致NSPredicate问题应用比较。如前所述,我无法弄清楚如何将lat / lon坐标保存为CoreData中的Double。这是我的JSON解析并保存到CoreData代码:

        let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary


       var items = [[String:AnyObject]()]
       var item:AnyObject

        for var i = 0; i < jsonResult[“jsonAirports"]!.count; i++ {

            items.append([String:AnyObject]())

            item = jsonResult[“jsonAirports"]![i] as NSDictionary 

            items[i]["AIRPORT"] = item["AIRPORT"] as? String

            items[i]["APCODE"] = item["APCODE"] as? String

            items[i]["APID"] = item["APID"] as? String

            items[i]["LAT"] = item["LAT"] as? String

            items[i]["LON"] = item["LON"] as? String

            items[i]["IMG"] = item["IMG"] as? String

            items[i]["UDATE"] = item["UDATE"] as? NSDate


            //Save to CoreData
            var addAirportItem = NSEntityDescription.insertNewObjectForEntityForName("Airports", inManagedObjectContext: context) as NSManagedObject

            addAirportItem.setValue(items[i]["AIRPORT"], forKey: "apName")                    

            addAirportItem.setValue(items[i]["APCODE"], forKey: "apCode")

            addAirportItem.setValue(items[i]["APID"], forKey: "apID")

            addAirportItem.setValue(items[i]["LAT"], forKey: "apLat")

            addAirportItem.setValue(items[i]["LON"], forKey: "apLon")

            addAirportItem.setValue(items[i]["IMG"], forKey: "apImg")

            addAirportItem.setValue(NSDate(), forKey: "apUpdate")

            context.save(nil)

        }

如果我将apLat的属性类型和apLon更改为Double,如何将上面的代码更改为setValue为Double?

0 个答案:

没有答案