2016-09-06 56 views
0

我只是想知道是否有任何方法來提高我的循環速度,或最佳實踐建議,因爲我覺得它看起來很糟糕。如何加快Swift循環的性能?

下面是代碼:

for (index, _) in filteredArray.enumerate() { 
    if index == 0 || index % 4 == 0 { 
     let mediaItem = Item() 
     mediaItem.id = filteredArray[index + 3] 
     let photoURL = NSURL(string: filteredArray[index + 1]) 
     guard let url = photoURL else { return } 
     let data = NSData(contentsOfURL: url) 
     let finishImage = UIImage(data: data!) 
     mediaItem.Photo = finishImage 
     mediaItem.orderCount = filteredArray[index + 2] 
     mediaItem.UUId = filteredArray[index] 
     self.dataSourceItems.insert(mediaItem) 
    } 
} 
+2

我的猜測是這條線:'let data = NSData(contentsOfURL:url)'由於網絡請求速度慢而花費的時間最多。你是否通過儀器運行代碼來找出瓶頸? –

+6

'NSData(contentsOfURL:url)'是同步的,這就是減慢你的循環。您可能會對異步Web調用感興趣... – Larme

+4

我看到您使用'if index == 0 || index%4 == 0'但0%4 = 0,所以,除非我錯了,你可以簡單地用'if index%4 == 0'替換你的條件。 –

回答

1

嘗試使用dispatch_apply。類似的東西:

let iterationsCount = filteredArray.count/4 
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

dispatch_apply(iterationsCount, queue) { i in 
    let index = i * 4 
    let mediaItem = Item() 
    mediaItem.id = filteredArray[index + 3] 
    let photoURL = NSURL(string: filteredArray[index + 1]) 
    guard let url = photoURL else { return } 
    let data = NSData(contentsOfURL: url) 
    let finishImage = UIImage(data: data!) 
    mediaItem.Photo = finishImage 
    mediaItem.orderCount = filteredArray[index + 2] 
    mediaItem.UUId = filteredArray[index] 
    self.dataSourceItems.insert(mediaItem) 
} 

注意,根據您的情況,您可能需要1,使用self內關閉,如果你訪問性能; 2.如果寫入共享內存,則添加一些鎖。