swift_dynamiccast tomando demasiado en el procesamiento y afectando el performance en iOS

Estoy haciendo mucha computación para analizar y crear una combinación de datos json provenientes del server. Todo el process lleva mucho time y, sobre todo, he corregido el problema relacionado con el código, pero en un momento el profiler muestra el time que toma una llamada en particular que no puedo descifrar. introduzca la descripción de la imagen aquí

Tengo mucho casting en process. Crea muchos objects de tipo FlightFare y lo creo desde un dictionary.

Entonces, el conveninece init se ve a continuación, ¿cómo puedo evitarlo?

convenience init (dictionary: [String:AnyObject]) { self.init() refundType = dictionary["rt"] as! String if let unwrappedScore = dictionary["r"] as? Double { score = unwrappedScore } if let unwrappedValue = dictionary["t"] as? Int { taxes = unwrappedValue } if let unwrappedValue = dictionary["bf"] as? Int { baseFare = unwrappedValue } if let unwrappedValue = dictionary["f"] as? Int { fee = unwrappedValue } if let unwrappedValue = dictionary["d"] as? Int { discount = unwrappedValue } if let unwrappedValue = dictionary["tf"] as? Int { fare = unwrappedValue } if let unwrappedValue = dictionary["ttf"] as? Int { totalFare = unwrappedValue } if let unwrappedValue = dictionary["hbo"] as? Bool { hbo = unwrappedValue } providerKey = dictionary["pk"] as? String hbf = dictionary["hbf"] as? [String] } 

¿Suena como el impuesto pagado cuando se hacen cosas como el value as? String value as? String Dejaste ese nodo queuepsado en el perfil, así que solo puedo dar consejos generales para evitar esto: Asegúrate de no procesar repetidamente los mismos datos en su forma original. Reparto una vez como parte de la migration a una forma intermedia mecanografiada.

Minimizar los models de types es algo que las diversas bibliotecas Swift JSON, como Fnetworkingdy y SwiftyJSON, intentan garantizar en su análisis de JSON.

Si la estructura de sus datos JSON es igualmente incierta, ¿es este nodo una cadena o un object o simplemente nulo? – entonces su código se ejecuta y debe abordar este problema también en ese nivel.

ETA: si el costo de los moldes se cobra notablemente a su conveniencia init (debería verificar esto usando el perfil), entonces ese método sería un problema. Puede evitarlo utilizando una biblioteca que analiza JSON en una representación mecanografiada, como Fnetworkingdy mencionó anteriormente. Esto reemplaza el casting en su código con la enumeración de casos en la biblioteca.

A menudo es útil marcar el recuadro en las opciones de perfil que le indican que no muestre su código marco, de modo que pueda ver fácilmente cuáles de los methods que controla directamente toman time. Luego, puede profundizar en el perfil para get statistics de costo por línea para enfocar su optimization.

Podrías escribir el init () un poco diferente para separar el tipo de molde de forma de desenvolver y ganar alnetworkingedor de un 40% de velocidad

  for (key,value) in dictionary { switch key { case "rt" : refundType = value as! String case "r" : score = value as! Double case "bf" : baseFare = value as! Int case "f" : fee = value as! Int case "d" : discount = value as! Int case "tf" : fare = value as! Int case "ttf" : totalFare = value as! Int case "hbo" : hbo = value as! Bool case "pk" : providerKey = value as! String case "hbf" : hbf = value as! [String] default : break } } 

O bien, si el dictionary contiene NSNumbers, NSStrings, etc. y está dispuesto a trabajar con los types "NS" para su variable interna, no habría una conversión "dinámica" y obtendría un aumento de performance de 13x para eso parte:

  for (key,value) in dictionary { switch key { case "rt" : refundType = value as! NSString case "r" : score = value as! NSNumber case "bf" : baseFare = value as! NSNumber case "f" : fee = value as! NSNumber case "d" : discount = value as! NSNumber case "tf" : fare = value as! NSNumber case "ttf" : totalFare = value as! NSNumber case "hbo" : hbo = value as! NSNumber case "pk" : providerKey = value as! NSString case "hbf" : hbf = value as! NSArray default : break } } 

Otra estrategia que podría usar es almacenar el dictionary dentro del object sin asignar las variables y hacer que los inicios sean perezosos sus valores:

Por ejemplo:

  var defaultDict:[String:AnyObject] = [:] lazy var score:Double = self.defaultDict["r"] as? Double ?? 0 lazy var baseFare:Int = self.defaultDict["bf"] as? Int ?? 0 ... convenience init (dictionary:[String:AnyObject]) { self.init() defaultDict = dictionary } 

Esto solo wok si el init () no hace reference a estas variables por otros motivos, pero debería llevar el time de creación del object a casi nada y diferir / propagar los times de lanzamiento de tipo solo ejecutándolos en el uso real de los datos.

Primero, usa [String: Any] lugar de [String: AnyObject] para dictionary en Swift.

Intenta usar SwiftyJSON

SwiftyJSON facilita el event handling los datos JSON en Swift.

PD: Tener tantas otras condiciones no es una buena práctica.

No debería estar buscando un valor antes de asignar.

Si todos esos valores son opcionales, simplemente puede asignar el valor opcional score = dictionary["r"] as? Double score = dictionary["r"] as? Double y si no hay valor para esa tecla, simplemente lo asignará como nulo.

Si desea que las variables tengan un valor pnetworkingeterminado, puede nil combinar el valor score = dictionary["r"] as? Double ?? 0 score = dictionary["r"] as? Double ?? 0

Esto networkingucirá la cantidad de veces que tiene que acceder al dictionary por la mitad y también networkingucirá la asignación de variables temporales.