swift_dynamiccast在处理过程中占用太多,影响了iOS的性能

Ank*_*ava 11 iphone profiling ios swift

我在解析和从服务器的json数据创建一些组合方面做了很多计算.整个过程需要花费大量时间,主要是我有固定的代码相关问题但在一个地方时间分析器显示一个特定呼叫所花费的时间,我无法弄清楚. 在此输入图像描述

我的处理中有很多铸件.它创建了许多FlightFare类型的对象,我从字典创建它.

所以,方便的init看起来如下,我该如何避免它?

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]
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*man 5

听起来就像在做这样的事情时缴纳的税款value as? String.您将该节点折叠在配置文件中,因此我只能提供有关避免此操作的一般建议:确保您不会以原始格式重复处理相同的数据.作为迁移到类型化中间形式的一部分,转换一次.

最小化类型转换是各种Swift JSON库(如Freddy和SwiftyJSON)在解析JSON时尝试保证的.

如果JSON数据的结构同样不确定 - 这个节点是字符串还是对象还是只是null? - 那么你的代码就会遇到并且必须在那个级别解决这个问题.

ETA:如果演员的费用明显地计入您的便利init(您应该使用配置文件验证这一点),那么该方法确实会成为一个问题.您可以通过使用将JSON解析为类型化表示的库来避免它,例如前面提到的Freddy.这将替换代码中的强制转换,并在库中使用枚举大小写匹配.

选中配置文件选项中的框以告诉它不向您显示框架代码通常很有用,这样您就可以轻松地看到您直接控制哪些方法需要时间.然后,您可以在配置文件中钻取以获取每行成本统计信息,以便集中优化.