调度加载 UIImages 产生意外结果

戴恩·卡罗

我正在构建一个应用程序,该应用程序具有多个图像(计划),这些图像(计划)在带有页面内容的滚动视图上加载和设置。我试图在主线程上加载第一个图像,然后从它在后台线程上的索引加载周围的图像。当我需要使用加载的数据设置它们的图像时,所有 UIImageViews 都在一个数组 (planImages) 中以供参考。

问题是图像并不总是随着最近加载的图像更新。这是我第一次使用 Dispatch,所以我做错了什么吗?这是给我问题的代码部分。

    func setupPagesInScrollView(firstImage: Int)
{
    let numberOfPages: CGFloat = CGFloat(selectedDetails!.numberOfPlans)

    scrollView!.contentSize = CGSize(width: scrollView!.frame.width * numberOfPages, height: scrollView!.frame.height)
    pageControl!.numberOfPages = selectedDetails!.numberOfPlans

    if(planImages.count < selectedDetails!.numberOfPlans)
    {
        for index in planImages.count...selectedDetails!.numberOfPlans - 1
        {
            let iView = UIImageView()
            iView.frame = CGRect(x: 0, y: 0, width: scrollView!.frame.width, height: scrollView!.frame.height)
            planImages.append(iView)
            scrollView!.addSubview(iView)

            iView.translatesAutoresizingMaskIntoConstraints = false
            iView.topAnchor.constraint(equalTo: scrollView!.topAnchor).isActive = true
            iView.leftAnchor.constraint(equalTo: scrollView!.leftAnchor, constant: scrollView!.frame.width * CGFloat(index)).isActive = true
            iView.heightAnchor.constraint(equalToConstant: scrollView!.contentSize.height).isActive = true
            iView.widthAnchor.constraint(equalToConstant: scrollView!.frame.width).isActive = true
        }
    }

    DispatchQueue.global(qos: .background).async
        {
            //Load first selected image
            let path = self.selectedDetails!.dirPath + self.selectedDetails!.plansName
            self.setupImageAtIndex(path: path, index: firstImage)

            //Build Image data around first image on background threads
            var mask = 1
            let max = self.selectedDetails!.numberOfPlans

            while firstImage + mask < max || firstImage - mask > 0
            {
                if(firstImage + mask < max)
                {
                    self.setupImageAtIndex(path: path, index: firstImage + mask)
                }

                if(firstImage - mask >= 0)
                {
                    self.setupImageAtIndex(path: path, index: firstImage - mask)
                }

                mask = mask + 1
            }

            //Remove extra images from memory if needed
            if(self.planImages.count > self.selectedDetails!.numberOfPlans)
            {
                let dif = self.planImages.count - self.selectedDetails!.numberOfPlans

                for _ in 1...dif
                {
                    let index = self.planImages.count - 1
                    let plan = self.planImages[index]
                    self.planImages.remove(at: index)
                    plan.removeFromSuperview()
                    plan.image = nil
                }
            }
    }
}

private func setupImageAtIndex(path: String, index: Int)
{
    let imageName = index + 1 > 9 ? path + String(index + 1) : path + "0" + String(index + 1)

    planImages[index].image = UIImage(contentsOfFile: imageName)
}
iOS_Maccus

根据苹果文档您必须更新主队列上的 UI 元素

像这样更新你的代码

private func setupImageAtIndex(path: String, index: Int)
    {
        let imageName = index + 1 > 9 ? path + String(index + 1) : path + "0" + String(index + 1)
        DispatchQueue.main.async {
            planImages[index].image = UIImage(contentsOfFile: imageName)

        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章