繁体   English   中英

Swift:由于URLSession.DataTask而递归调用ViewDidLoad

[英]Swift: Calling ViewDidLoad recursively due to URLSession.DataTask

我在用图像列表填充场景时遇到麻烦。 我正在使用UIViewController而不是tableView来显示我的界面。 想象一下Tinder之类的应用程序。 没有tableview。 要滚动浏览图像,每张图像都将滑动到下一张。

我填充场景中图像的方式是通过使用URLSession.DataTask在ViewDidLoad中发出POST请求。 但是我似乎无法解决多线程问题。

原始代码:

ViewDidLoad(){
        queryService.getProduct { productlist, errorMessage in

            if !errorMessage.isEmpty { print("Search error: " + errorMessage) }

            self.products = productlist
        }

        // CODE TO initialize View
        // MORE CODE
}

queryService包含URLSession.DataTask,后者调用URL并执行序列化。 该方法已正确实施。 我面临的问题是“代码初始化视图”部分之后实例化了self.products。 它们似乎都在并行运行。 因此,这是我为修复此问题所做的工作:

快速解决:

var count = 0
ViewDidLoad(){
     if count == 0 {
        queryService.getProduct { productlist, errorMessage in

            if !errorMessage.isEmpty { print("Search error: " + errorMessage) }

            self.products = productlist
            self.count = 1
            self.ViewDidLoad()
        }
     } else {
        // CODE TO initialize View
        // MORE CODE
     }
}

这可行,但是我知道我的快速解决方案不是最佳实践。 关于最佳解决方案有什么建议吗? 谢谢。 还有一个后续问题:像这样手动调用viewdidload可以吗?

您可以执行此功能,但不能在`viewDidLoad中进行

override func viewDidLoad() {
    super.viewDidLoad()
    getProductUntilThereIsOneProductAtLeast()
}

func getProductUntilThereIsOneProductAtLeast() {
    if count == 0 {
        queryService.getProduct { productlist, errorMessage in

            if !errorMessage.isEmpty { print("Search error: " + errorMessage) }

            self.products = productlist
            self.count = 1
            self.getProductUntilThereIsOneProductAtLeast()
        }
    } else {
        // CODE TO initialize View
        // MORE CODE
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM