我正在制作一个用Swift编写的高尔夫应用程序。在我的应用程序内部,我有一个搜索栏,用户可以在其中搜索高尔夫球场。我在Xcode中有一个包含大型高尔夫球场数据库的大型JSON文件。我解析这个JSON数据库,为我提供高尔夫球场的名称和位置,然后在用户在搜索栏中搜索时显示它们。问题是JSON文件是17MB并且有大约18,000个高尔夫球场,这使得解析过程变长并且当用户开始在搜索栏中输入直到大约6秒时,高尔夫球场名称不会开始填充。 / p>
我目前有一个DataManager类可以获取并获取我的JSON文件。我使用SwiftyJSON帮助解析数据,然后将数据附加到数组中,以便我可以在搜索栏的表格视图中显示它。
有关如何加快解析这么大的文件或减小文件大小的任何建议吗?
提前致谢!
为我的数据管理器和我的解析我的JSON文件的函数编码:
DataManager:
class DataManager {
class func getGolfCoursesFromFileWithSuccess(success: ((data: NSData) -> Void)) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
let filePath = NSBundle.mainBundle().pathForResource("golfCourseData",ofType:"json")
var readError:NSError?
do {
let data = try NSData(contentsOfFile:filePath!,
options: NSDataReadingOptions.DataReadingUncached)
success(data: data)
} catch let error as NSError {
readError = error
print(readError)
} catch {
fatalError()
}
})
}
}
解析JSON的函数(在viewDidLoad中调用):
func loadCoursesFromJSONFile() {
DataManager.getGolfCoursesFromFileWithSuccess { (data) -> Void in
let json = JSON(data: data)
if let courseArray = json.array {
for course in courseArray {
let golfCourseName: String? = course["biz_name"].string
if golfCourseName != nil {
let golfCourse = GolfCourse(className: "PreviousCourse")
golfCourse.courseName = golfCourseName!
self.golfCourseCollection.append(golfCourse)
}
}
}
}
}
JSON示例:
- 我只需要" biz_name"," e_city"," e_state"
{
"id":18634,
"biz_name":"Twin Lakes Golf Course",
"e_address":"6100 Clifton Rd",
"e_city":"Clifton",
"e_state":"VA",
"e_postal":"20124",
"e_zip_full":"",
"e_country":"USA",
"loc_county":"Fairfax",
"loc_area_code":703,
"loc_FIPS":51059,
"loc_MSA":null,
"loc_PMSA":8840,
"loc_TZ":"EST",
"loc_DST":"Y",
"loc_LAT_centroid":"38.7803",
"loc_LAT_poly":38.819444,
"loc_LONG_centroid":-77.3913,
"loc_LONG_poly":-77.402822,
"biz_phone":"(703) 631-9372",
"metal_spikes":"U",
"play_five":"U",
"c_holes":"18",
"c_type":"Public",
"year_built":"",
"c_designer":"",
"c_season":"",
"guest_policy":"",
"dress_code":"",
"green_fees":"",
"weekend_rates":"$26 wknd",
"adv_tee":"7 days",
"FIELD33":""
},
答案 0 :(得分:4)
“包含大型高尔夫球场数据库” - 您已在此处提及关键字: 数据库
不要使用Json文件来完成数据库所在的工作。使用普通的sqlite数据库或fmdb包装器,realm.io或CoreData或除原始文件之外的其他内容。通过这种方式,您可以运行更高性能的查询,您不必在内存中保存所有18k folg课程等。搜索示例使用带有搜索谓词的CoreData数据库可能比使用手动搜索更高效。关于非索引文本数据。
如果您仍然不相信并且仍然想要使用json - 请确保json没有变得更好,例如没有不必要的空格,制表符,换行符等。