我正在使用SwiftyJSON pod,并且得到了这样的JSON:
我在此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: "مشکل در ارتباط با اینترنت")
}
}
}
答案 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?)可能会有所帮助,但我对非拉丁脚本的工作并不十分了解,无法真正分辨出来。