Swift代码嵌套If语句很慢



我有一个代码如下:

var fullJSON = "["
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Job")
do {
if let jobs = try coreDataContext().fetch(fetchRequest) as? [Job] {

// let jobs: [Job] = fetchCoreData(entity: "Job")
for job in jobs {
if let json = job.toJSON() {


/*if (fullJSON.count > 1) {

//print( "size of values is : (fullJSON)" )

//fullJSON += ",n "
}*/
fullJSON += json

//print( "size of values is : (fullJSON)" )
} else {
print("COULDN'T JSON (job.name ?? "")")
callback("Error decoding (job.name ?? "")")
return
}
}

fullJSON += "]"

API.sync(json: fullJSON) { (result) in
DispatchQueue.main.async {
if !result.success {
callback("Network error: " + result.error)
return
}
guard let jsonJobs = result.payload?["jobs"] as? [NSDictionary] else {
callback("Error parsing result"); return
}

//delete existing
let existing: [Job] = self.fetchCoreData(entity: "Job")
for item in existing {
self.coreDataContext().delete(item)
}
for job in jsonJobs {
let newJob = Job.init(context: self.coreDataContext())
newJob.load(job, context: self.coreDataContext())
}


try? self.coreDataContext().save()
callback(nil)
}
}
} else {
callback("Error getting jobs")
}
} 

当我运行这个代码时,它非常慢!

我已经把问题指向这个代码:

if (fullJSON.count > 1) {
fullJSON += ",n "
}

如果我删除了那个代码,一切又快了!

我不知道为什么代码的那一小部分会让一切变得如此缓慢!

有人能就此提出建议吗?

然而,关于更好的任务方法的有效评论。。。

很确定的速度差异是在使用:

if (fullJSON.count > 1) {

CCD_ 1是非常昂贵的操作。

请尝试将其添加到视图控制器中。每次你点击任何地方,我们都会通过添加"来模拟你的json活动;ABC";到字符串var.

第一个循环使用您的CCD_ 2来决定添加";,\n〃;

第二个循环使用Bool变量将";,\n〃;只有在第一次通过之后。

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
var fullJSON: String = ""

var length1: Int = 0
var length2: Int = 0
var st1 = CFAbsoluteTimeGetCurrent()
var st2 = CFAbsoluteTimeGetCurrent()
var ed1 = CFAbsoluteTimeGetCurrent()
var ed2 = CFAbsoluteTimeGetCurrent()
st1 = CFAbsoluteTimeGetCurrent()
fullJSON = "["
for _ in 1...5000 {
if fullJSON.count > 1 {
fullJSON += ",n"
}
fullJSON += "ABC"
}
ed1 = CFAbsoluteTimeGetCurrent()
length1 = fullJSON.count

var b: Bool = false

st2 = CFAbsoluteTimeGetCurrent()
fullJSON = "["
for _ in 1...5000 {
if b {
fullJSON += ",n"
}
fullJSON += "ABC"
// we've gone through once
b = true
}
ed2 = CFAbsoluteTimeGetCurrent()

length2 = fullJSON.count

print("Timing:", ed1 - st1, ed2 - st2)

// to confirm we get same resulting string lengths
print("Lengths:", length1, length2)

print()
}

以下是我在5次跑步中得到的:

Timing: 0.5321569442749023 0.002187013626098633
Lengths: 24999 24999
Timing: 0.5368150472640991 0.0024269819259643555
Lengths: 24999 24999
Timing: 0.5297999382019043 0.002218961715698242
Lengths: 24999 24999
Timing: 0.5305029153823853 0.002167940139770508
Lengths: 24999 24999
Timing: 0.5307689905166626 0.0022219419479370117
Lengths: 24999 24999

当然,这不是评测代码的理想方式,但我们可以很容易地看到这里的巨大差异。

最新更新