ios - 大型 JSON 文件 Swift

标签 ios json swift large-files swifty-json

我正在制作一个用 Swift 编写的高尔夫应用程序。在我的应用程序中,我有一个搜索栏,用户可以在其中搜索高尔夫球场。我在 Xcode 中有一个大型 JSON 文件,其中包含一个大型高尔夫球场数据库。我解析此 JSON 数据库以提供高尔夫球场的名称和位置,然后在用户在搜索栏中搜索时显示它们。问题是 JSON 文件有 17MB,大约有 18,000 个高尔夫球场,这使得解析过程很长,并且当用户开始在搜索栏中输入大约 6 秒时,高尔夫球场名称才开始填充。

我目前有一个 DataManager 类,它可以抓取我的 JSON 文件。我使用 SwiftyJSON 来帮助解析数据,然后将该数据附加到一个数组中,这样我就可以在搜索栏的表格 View 中显示它。

关于如何加快解析如此大的文件或减小文件大小的过程有什么建议吗??

提前致谢!

-我的数据管理器代码和解析 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":"$26 wknd",
"adv_tee":"7 days",
"FIELD33":""

},

最佳答案

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

不要使用 Json 文件来完成数据库的工作。使用普通的 sqlite 数据库或 fmdb 包装器、realm.io 或 CoreData 或除原始文件以外的其他内容。这样你就可以运行更高效的查询,你不必在内存中保存所有 18k folg 类(class)等。例如,使用带有搜索谓词的 CoreData 数据库进行搜索可能比手动搜索更高效在非索引文本数据上。

如果你仍然不相信并且仍然想使用 json - 确保 json 不是漂亮的,例如没有不必要的空格、制表符、换行符等。

关于ios - 大型 JSON 文件 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34252955/

相关文章:

ios - 建立 Sinch 应用程序到应用程序调用的接收者 'userId' 应该是什么?

Javascript 推送

php - Laravel 的 TestCase 方法 seeJson() 只查找数组

ios - Swift - 发布构建崩溃,除非我关闭优化

ios - SwiftUI View 不更新

ios - 重新加载 UINavigationItem

ios - 分享我的 XCode 项目而不让其他人看到它是伪代码

ios - touchesEnded with addGesture

javascript - d3.js - 树布局 - 如何翻转它?

ios - 如何知道使用 MapKit 的异步搜索何时完成