大 JSON 文件 Swift
large JSON file Swift
我正在制作一个用 Swift 编写的高尔夫应用程序。在我的应用程序中,我有一个搜索栏,用户可以在其中搜索高尔夫球场。我在 Xcode 中有一个大型 JSON 文件,其中包含一个大型高尔夫球场数据库。我解析这个 JSON 数据库,为我提供高尔夫球场的名称和位置,然后在用户在搜索栏中搜索时显示它们。问题是 JSON 文件是 17MB,大约有 18,000 个高尔夫球场,这使得解析过程很长,并且当用户开始在搜索栏中输入时高尔夫球场名称直到大约 6 秒才开始填充.
我目前有一个 DataManager Class,它可以抓取我的 JSON 文件。我正在使用 SwiftyJSON 来帮助解析数据,然后将该数据附加到一个数组中,这样我就可以在搜索栏的 table 视图中显示它。
关于如何加快解析如此大的文件或减小文件大小的任何建议?
提前致谢!
-我的数据管理器代码和解析我的 JSON 文件的函数:
数据管理器:
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":" wknd",
"adv_tee":"7 days",
"FIELD33":""
},
"containing a large golf course data base" - 您已经在此处提到关键字:database
不要使用 Json 文件来完成数据库的工作。使用普通的 sqlite 数据库或 fmdb 包装器、realm.io 或 CoreData 或除原始文件以外的其他内容。这样你就可以 运行 更高效的查询,你将不必在内存中保存所有 18k folg 课程等。例如,使用带有搜索谓词的 CoreData 数据库的搜索可能比你只使用 CoreData 数据库更高效对非索引文本数据进行手动搜索。
如果您仍然不相信并且仍想使用 json - 请确保 json 没有经过优化,例如没有不必要的空格、制表符、换行符等
我正在制作一个用 Swift 编写的高尔夫应用程序。在我的应用程序中,我有一个搜索栏,用户可以在其中搜索高尔夫球场。我在 Xcode 中有一个大型 JSON 文件,其中包含一个大型高尔夫球场数据库。我解析这个 JSON 数据库,为我提供高尔夫球场的名称和位置,然后在用户在搜索栏中搜索时显示它们。问题是 JSON 文件是 17MB,大约有 18,000 个高尔夫球场,这使得解析过程很长,并且当用户开始在搜索栏中输入时高尔夫球场名称直到大约 6 秒才开始填充.
我目前有一个 DataManager Class,它可以抓取我的 JSON 文件。我正在使用 SwiftyJSON 来帮助解析数据,然后将该数据附加到一个数组中,这样我就可以在搜索栏的 table 视图中显示它。
关于如何加快解析如此大的文件或减小文件大小的任何建议?
提前致谢!
-我的数据管理器代码和解析我的 JSON 文件的函数:
数据管理器:
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":" wknd",
"adv_tee":"7 days",
"FIELD33":""
},
"containing a large golf course data base" - 您已经在此处提到关键字:database
不要使用 Json 文件来完成数据库的工作。使用普通的 sqlite 数据库或 fmdb 包装器、realm.io 或 CoreData 或除原始文件以外的其他内容。这样你就可以 运行 更高效的查询,你将不必在内存中保存所有 18k folg 课程等。例如,使用带有搜索谓词的 CoreData 数据库的搜索可能比你只使用 CoreData 数据库更高效对非索引文本数据进行手动搜索。
如果您仍然不相信并且仍想使用 json - 请确保 json 没有经过优化,例如没有不必要的空格、制表符、换行符等