在iOS

时间:2017-03-31 02:18:28

标签: ios swift grand-central-dispatch dispatch-async

我需要将我的包中的大约200张图像加载到内存中的数组中,如下所示:

let arr = (0..<200).map({UIImage(named: "\($0).png")})

唯一的问题是它需要永远做..因此我想在后台执行此操作并在作业完成时获得回调..

我想我可以这样做:

var arr = [] DispatchQueue.main.async({ arr = (0..<200).map({UIImage(named: "\($0).png")}) })

但是那时我怎么知道该块何时完成?谢谢!

编辑:我需要将这些内容加载到内存中,因为我想在UIImageView中为这一系列图像设置动画,如下所示:

let img: UIImageView()
img.animationImages = arr
img.duration = 1
img.startAnimating()

1 个答案:

答案 0 :(得分:2)

您可以创建一个回调并在后台线程上加载图像后调用它,因为图像将在那里同步加载。

我建议做这样的事情:

func loadImages(callback: @escaping ([UIImage]) -> Void) {
    DispatchQueue.global(qos: .background).async {
        let array = (0..<200).flatMap({ UIImage(named: "\($0).png") })
        callback(array)
    }
}

可以像这样使用(使用swift尾随闭包语法):

loadImages { images in
    // do something with the images
}

您可能需要将callback(array)发送回DispatchQueue.main