使用swiftyJSON的低速

时间:2018-07-21 15:33:36

标签: json swift

我正在使用SwiftyJSON pod,并且得到了这样的JSON: enter image description here

我在此JSON中使用一个简单的for循环。但问题是它的速度非常低,因此需要大约4秒钟才能完成循环。 这是我的代码:

 for _ in jsonDariafti!["contacts"]{

                if (jsonDariafti!["contacts"][i]["name"].stringValue.range(of: txtSearch.text!) != nil)  {
                    arrayINdexPathSearch.append(i)
                }
                i = i + 1

            }

我正在尝试在此JSON中进行搜索。对于用户键入的每个单词,他必须等待大约4秒钟。我在下面使用for循环并将其更改为数组,然后在数组中搜索。它工作正常。但在初始for循环中仍然很低,大约需要5秒钟:

    for _ in jsonDariafti!["contacts"]{

             arraySearch.append(jsonDariafti!["contacts"][i]["name"].stringValue)
                i = i + 1

            }

使用JSONS还有更好的方法吗?或使用JSON的任何建议?

编辑: 这就是我获取JSON的方式:

#import SwiftyJSON
#import Alamofire 


func getdata(){
    Alamofire.request("http://rsptint.ir/getSefaresh.php", method: .get).responseJSON {
        response in
        if  response.result.isSuccess {
            self.jsonDariafti = JSON(response.result.value!)

        } else{
            self.showAlert(message: "مشکل در ارتباط با اینترنت")
        }

    }

}

2 个答案:

答案 0 :(得分:0)

我强烈建议您放弃SwiftyJSON和您正在执行的基于字符串和字典的搜索,并用基于Codable的简单得多的代码来代替它。

struct Sefaresh: Codable {
    let contacts: [Contact]
}

struct Contact: Codable {
    let code, name, id, carton, tedad, litr, vahed, vazn: String
}

let sefaresh = try? JSONDecoder().decode(Sefaresh.self, from: jsonData)

然后您的第一个循环变为

for (index, contact) in sefaresh.contacts.enumerated() {
   if contact.stringValue.range(of: txtSearch.text!) != nil {
     arrayIndexPathSearch.append(index)
   }
}

第二个就是

for contact in sefaresh.contacts {
    arraySearch.append(contact.name)
}

答案 1 :(得分:0)

这可能不是答案,而是对问题的阐述,但是经过大量的调整和调整,我可以执行以下操作:

import Cocoa

let jsonData = """
{ "contacts": [
  {"code":"AC60-12","name":"\u{0633}\u{0641}\u{06cc}\u{062f} \u{067e}\u{0644}\u{06cc} \u{0627}\u{0648}\u{0631}\u{0647} \u{062a}\u{0627}\u{0646}-\u{06a9}\u{0627}\u{0631}\u{062a}\u{0646} 12\u{062a}\u{0627}\u{06cc}\u{06cc}","id":"5","carton":"1","tedad":"12","litr":"12","vahed":"","vazn":"1"},
  {"code":"AC60-6","name":"\u{0633}\u{0641}\u{06cc}\u{062f} \u{067e}\u{0644}\u{06cc} \u{0627}\u{0648}\u{0631}\u{0647} \u{062a}\u{0627}\u{0646}-\u{06a9}\u{0627}\u{0631}\u{062a}\u{0646} 6\u{062a}\u{0627}\u{06cc}\u{06cc}","id":"4","carton":"1","tedad":"6","litr":"6","vahed":"","vazn":"1"},
  {"code":"ME1019","name":"Brilliant White \u{06cc}\u{06a9} \u{0644}\u{06cc}\u{062a}\u{0631}\u{06cc} ME 1019","id":"516","carton":"1","tedad":"6","litr":"6","vahed":"","vazn":"1"}]
}
""".data(using: .utf8)!

struct Sefaresh: Codable {
    let contacts: [Contact]
}

struct Contact: Codable {
    let code, name, id, carton, tedad, litr, vahed, vazn: String
}

do {
    let sefaresh = try JSONDecoder().decode(Sefaresh.self, from: jsonData)
    print(sefaresh)
} catch {
    print(error)
}

这看起来更加可怕,但它可能还会指出您遇到的一些问题。它可能与Playground的典型编码(UTF-8)有关,但即使这样,它仍可以正确编译,并且结果中包含许多字符,这些字符似乎源自您发布的同一脚本。

在到达那里时,我不得不像在String解析期间那样处理很多错误

Expected hexadecimal code in braces after unicode escape

,我只能手动更正,任何搜索/替换模式都将失败,即使在引入了花括号之后,编辑器有时也只能像拖动一样进行搜索。一般而言,您似乎遇到了使Xcode甚至Swift String解析器完全混淆的事情(尽管可能性很小,因为一旦编译后,Playground就会快速运行,并且不会出错)。

我不确定首先由谁或什么来创建转义的JSON,但是如果这是一种仍然假设您的unicode字符都应该在16位之内的语言,这可能会解释某些问题。

您是否想一开始详细说明是什么创建了JSON?根据我在Playground上的经验(直到我开始引入换行符后,它才变得完全没有反应),我可以轻易地相信您触发了Swifts String解析的一些极端情况。鉴于有这么多的转义形式,Swift可能无法理解,我很确定会发生任何事情。

如果有可能在您的contacts末尾引入换行符,这可能会有所帮助,当然,括号将起到很大作用,因为它们似乎是Swift希望您的转义的方式。也许其他一些编码(例如UTF-16?)可能会有所帮助,但我对非拉丁脚本的工作并不十分了解,无法真正分辨出来。