Оптимизация сопоставления объектов из большого массива JSON и добавление сопоставленных объектов в Realm - PullRequest
0 голосов
/ 31 августа 2018

Наше приложение Swift извлекает относительно большой набор данных JSON с 15.000 объектов (и увеличивается), выполняет сопоставление объектов с использованием библиотеки ObjectMapper, а затем добавляет объекты в базу данных Realm.

Однако сопоставление объектов и добавление объектов в Realm занимает довольно много времени - 15 секунд на самом быстром iPhone. Даже при попытке пропустить тяжелые операции преобразования даты / времени обработка по-прежнему занимает 12 секунд.

Поскольку сопоставленные объекты используются для отображения объектов на карте, недопустимо, чтобы пользователь ждал 15 секунд, чтобы увидеть экран.

Чтобы улучшить взаимодействие с пользователем, мы выбираем данные JSON при запуске приложения, а затем вызываем сопоставление объектов с наименьшим фоновым приоритетом в заявке, чтобы предоставить пользователю беспроблемное взаимодействие, поэтому тяжелые операции выполняются во время создания аккаунт.

Я хотел бы оптимизировать этот процесс с точки зрения более разумной выборки и анализа данных. Что вы предлагаете для этого?

Вот метод в расширении Realm, который я использую для отображения и добавления в базу данных, где Mapper<T>().mapArray(JSONArray: json) напрямую вызывает метод отображения ObjectMapper:

/**
Import JSON as array of BaseMappable Object.
- parammeter T: BaseMappable Object.
- parameter type: mapped type.
- parameter json: JSON type is [[String: Any]].
- returns: mapped objects.
*/
@discardableResult
public func map<T: Object>(_ type: T.Type, json: [[String: Any]], update: Bool = false) -> [T] where T: BaseMappable {
    let objs = Mapper<T>().mapArray(JSONArray: json)
    add(objs, update: update)
    return objs
}

Вот самая тяжелая трассировка стека от Profiler (с отфильтрованными системными вызовами):

40 14919,0 MyAwesomeApplication (6446): 0 39 14130,0 _dispatch_workloop_worker_thread $ VARIANT $ armv81 0x2367c7: 0 38 libsystem_pthread.dylib 14130.0 _pthread_wqthread 34 libdispatch.dylib 13870.0 _dispatch_call_block_and_release 33 MyAwesomeApplication 13870.0 _T0Ieg_IeyB_TR /Users/blackbeard/Developer/awesomeapp/ios-app/awesomeapp/Library/Core/Router.swift:0 24 MyAwesomeApplication 11562.0 _T012ObjectMapper0B0C11MyAwesomeApplication10RealmSwift0A0CRbzrlE3mapy9Alamofire6ResultOyypG6result_AD8DataTypeO4typeSSSg7withKeySb6updateSb12inBackgroundyALc10completiontF10runMappingL0_yyAGRbzAA12BaseMappableRzlFyyKcfU_AD5StoreC_Tg5Tm 23 RealmSwift 11550.0 Realm.write (_ :) /Users/blackbeard/Developer/awesomeapp/ios-app/Pods/RealmSwift/RealmSwift/Realm.swift:155 22 MyAwesomeApplication 11550.0 _T012ObjectMapper0B0C11MyAwesomeApplication10RealmSwift0A0CRbzrlE3mapy9Alamofire6ResultOyypG6result_AD8DataTypeO4typeSSSg7withKeySb6updateSb12inBackgroundyALc10completiontF10runMappingL0_yyAGRbzAA12BaseMappableRzlFyyKcfU_yyKcfU_AD5StoreC_Tg5TA 20 MyAwesomeApplication 11550.0 _T012ObjectMapper0B0C11MyAwesomeApplication10RealmSwift0A0CRbzrlE3mapy9Alamofire6ResultOyypG6result_AD8DataTypeO4typeSSSg7withKeySb6updateSb12inBackgroundyALc10completiontF10runMappingL0_yyAGRbzAA12BaseMappableRzlFyyKcfU_yyKcfU_AD5StoreC_Tg5 /Users/blackbeard/Developer/awesomeapp/ios-app/awesomeapp/Library/Ext/Mapper.swift:55 19 ObjectMapper 9173.0 Mapper.mapArray (JSONArray :) /Users/blackbeard/Developer/awesomeapp/ios-app/Pods/ObjectMapper/Sources/Mapper.swift:0 15 ObjectMapper 9084.0 частичное применение для Thunk для @callee_guaranteed (@owned [String: Any]) -> (@out A ?, @error @owned Error) /Users/blackbeard/Developer/awesomeapp/ios-app/Pods/ObjectMapper/Sources/Mapper.swift:0 14 ObjectMapper 9084.0 thunk для @callee_guaranteed (@owned [Строка: Любой]) -> (@out A ?, @error @owned Error) /Users/blackbeard/Developer/awesomeapp/ios-app/Pods/ObjectMapper/Sources/Mapper.swift:0 13 ObjectMapper 9068.0 Mapper.map (JSON :) /Users/blackbeard/Developer/awesomeapp/ios-app/Pods/ObjectMapper/Sources/Mapper.swift:106 12 свидетелей протокола MyAwesomeApplication 8865.0 для BaseMappable.mapping (map :) в магазине соответствия /Users/blackbeard/Developer/awesomeapp/ios-app/awesomeapp/Model/Schema/Store/Store.swift:105 11 MyAwesomeApplication 8865.0 Store.mapping (карта :) /Users/blackbeard/Developer/awesomeapp/ios-app/awesomeapp/Model/Schema/Store/Store.swift:0 10 MyAwesomeApplication 8819.0 специализированный Store.mapping (карта :) /Users/blackbeard/Developer/awesomeapp/ios-app/awesomeapp/Model/Schema/Store/Store.swift:0 9 ObjectMapper 5450.0 _T012ObjectMapper3MapCACSScig/Users/blackbeard/Developer/awesomeapp/ios-app/Pods/ObjectMapper/Sources/Map.swift:63 8 ObjectMapper 5435.0 Map.subscript (ключ: вложенный: разделитель: ignoreNil :) /Users/blackbeard/Developer/awesomeapp/ios-app/Pods/ObjectMapper/Sources/Map.swift:96 7 ObjectMapper 5435.0 специализированный Map.subscript (ключ: вложенный: Разделитель: ignoreNil :) /Users/blackbeard/Developer/awesomeapp/ios-app/Pods/ObjectMapper/Sources/Map.swift:0 6 ObjectMapper 5070.0 специализированный Map.subscript (ключ: вложенный: Разделитель: ignoreNil :) /Users/blackbeard/Developer/awesomeapp/ios-app/Pods/ObjectMapper/Sources/Map.swift:99 5 libswiftFoundation.dylib 3397.0 _T0s14StringProtocolP10FoundationSS5IndexVADRtzrlE8containsSbqd__sAARd__lF 0 CoreFoundation 68.0 CFStringGetCStringPtr

...