大型JSON文件Swift

时间:2015-12-13 15:50:31

标签: ios json swift large-files swifty-json

我正在制作一个用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":""

},

1 个答案:

答案 0 :(得分:4)

“包含大型高尔夫球场数据库” - 您已在此处提及关键字: 数据库

不要使用Json文件来完成数据库所在的工作。使用普通的sqlite数据库或fmdb包装器,realm.io或CoreData或除原始文件之外的其他内容。通过这种方式,您可以运行更高性能的查询,您不必在内存中保存所有18k folg课程等。搜索示例使用带有搜索谓词的CoreData数据库可能比使用手动搜索更高效。关于非索引文本数据。

如果您仍然不相信并且仍然想要使用json - 请确保json没有变得更好,例如没有不必要的空格,制表符,换行符等。