2015-12-13 4 views
0

Я делаю приложение для гольфа, написанное в Swift. Внутри моего приложения у меня есть панель поиска, где пользователь может искать поле для гольфа. У меня есть большой JSON-файл в Xcode, содержащий большую базу данных для гольфа. Я разбираю эту базу данных JSON, чтобы дать мне название и местоположение полей для гольфа, а затем отобразить их, когда пользователь ищет в строке поиска. Проблема заключается в том, что файл JSON имеет размер 17 МБ и имеет примерно 18 000 полей для гольфа, что делает процесс синтаксического анализа длинным, и имена полей для гольфа не начинаются, когда пользователь начинает вводить текст в строку поиска примерно до 6 секунд.большой JSON файл Swift

В настоящее время у меня есть класс 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

Являются ли данные JSON только именем и расположением или есть другие данные? Не могли бы вы разобраться с более простой структурой, просто с данными, которые вам нужны немедленно? Не могли бы вы включить образец JSON? – ColGraff

+0

Есть другие данные, но мне нужны только три поля. – dcotter

ответ

4

"содержащий большую базу для игры в гольф данных" - вы уже упомянуть ключевое слово здесь: базы данных

Dont использовать файл JSON, чтобы сделать работу для чего нужна база данных. Используйте обычную базу данных sqlite или обертку fmdb, realm.io или CoreData или что-то иное, чем просто необработанный файл. Таким образом, вы можете запускать гораздо более эффективные запросы, вам не нужно будет удерживать все 18-килограммовые фолговые курсы в памяти и т. Д. Поиск, например, вероятно, будет более эффективным с использованием базы данных CoreData с предикатами поиска, чем только вы выполняете ручной поиск по неиндексированным текстовым данным.

Если вы все еще не убеждены и все еще хотите использовать json - убедитесь, что json не является допустимым, например. не имеет лишних пробелов, вкладок, разрывов строк и т. д.

+1

+1 Основные данные - это, безусловно, путь (или любая другая база данных, если на то пошло). Разделение файлов JSON на более мелкие части (на основе первой буквы, которую пользователь ищет) - это другое не-db-решение. – HAS

+0

Спасибо за предложение. Я все еще новичок в программировании на iOS, и я еще не работал с CoreData, realm и т. Д. Но я возьму это как возможность изучить один из них, чтобы использовать его в своем приложении. Спасибо, я ценю помощь. – dcotter

Смежные вопросы