Наше приложение 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