gpt4 book ai didi

ios - Swift URLSession 在制​​作 PageView 之前无法正常工作

转载 作者:行者123 更新时间:2023-11-28 07:35:47 25 4
gpt4 key购买 nike

我已阅读 this post ,但我无法解决我的问题。
DispatchQueue.main.async 代码无法对我的代码起作用。
我认为我的问题与此有点不同。所以我发布了我的问题。

我有 3 个观点。

enter image description here

FirstView 是一个表格 View ,用户可以选择他们的选择。
SecondView 是一个处理UIPageViewControllerDelegateDataSource 的 View 。
ThirdView 是一个 View ,它将成为Second view 的页面 View 。
(底部的 View 是PageViewController)

当用户选择并点击First View 上的按钮时,它会转到Second view
然后,Second View 显示结果。 (实际上,Third View 显示了结果,但它似乎只是显示在 Second View 中。)

根据用户在FirstView中的选择,结果的内容来自服务器上的数据库。

我认为在 ThirdView 上显示结果之前,我需要在 SecondView 中从服务器获取结果。

所以我在 SecondViewView Controller 中的 viewDidLoad 上编写了获取代码。

这是数据模型代码

struct MyData: Decodable {
let a: String
let b: String
let c: String
}

这是Second View类代码

class SecondView: UIViewController, UIPageViewControllerDelegate, 
UIPageViewControllerDataSource {

var pageViewController: UIPageViewController!
let pageControl: UIPageControl = UIPageControl()
let pageControlHeight: CGFloat = 20

var passedFromFirstVC: [String] = []
var pageTitle: [String] = []

override func viewDidLoad() {
super.viewDidLoad()

var request = URLRequest(url: NSURL(string: "http://xxxxx.xxx/" )! as URL)
request.httpMethod = "POST"
var postString = "xxxxxx"
request.httpBody = postString.data(using: String.Encoding.utf8)

let task = URLSession.shared.dataTask(with: request) {
(data, response, error) in

if error != nil {
return
}

guard let data = data else { return }

do {
let fetchedData = try JSONDecoder().decode([MyData].self, from: data)
print(fetchedData)
self.pageTitle.append(fetchedData[x].xx)

} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}
task.resume()

viewDidLoad 代码中,有 pageViewController 代码。
这是 viewDidLoad 中的剩余代码。

    self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "pageviewcontroller") as! UIPageViewController
self.pageViewController.delegate = self
self.pageViewController.dataSource = self
self.pageViewController.view.frame = CGRect(x: 0, y: 65, width: view.frame.width, height: view.frame.height)
let startVC = self.viewControllerAtIndex(index: 0) as! ContentViewController
let viewControllers = NSArray(object: startVC)
self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .forward, animated: true, completion: nil)
self.addChildViewController(self.pageViewController)
self.view.addSubview(self.pageViewController.view)
self.pageViewController.didMove(toParentViewController: self)
}

要制作页面索引,请遵循此代码。这是代码。

func viewControllerAtIndex(index: Int) -> ContentViewController {

let vc: ContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "ContentViewController") as! ContentViewController

vc.pageIndex = index
print("page just has been moved...")
print(pageTitles)

vc.titleText = pageTitles[index]
return vc
}

但是,当我运行该应用程序时,它会在此代码中停止 vc.titleText = pageTitles[index]
因为,pageTitles 为零。

于是我在viewDidLoad上打了个断点,发现task还没有编译。

它会忽略tasktask.resume()代码,然后遵守下面的代码。

因此,DispatchQueue.main.async 代码无法对我的代码起作用。

但是,当我在 pageTitle 中设置某些初始值时(即使在 task.resume() 之后),然后 task 已经编译了编译与其他 PageViewController 相关的代码。

而且,当我在另一个项目中使用一个 ViewController(不像我的 PageViewController)编写这段代码时,它还会编译 task viewDidLoad 中的代码。

为什么这道题的task代码没有编译通过?

而且,我如何在编译页面 View Controller 代码之前获取数据?

最佳答案

我从 this post 的评论中找到了答案.
这是评论。

Move the line print(scenarioArray) and everything you want to do afterwards from viewDidLoad into the completion block after self.scenarioArray = ....

重点是通过制作 DispatchQueue.main.async { code } 将 viewDidLoad 中的其他代码放入完成 block (在此代码中,do block ) do block 中。

答案在这里。

override func viewDidLoad() {

super.viewDidLoad()
var request = URLRequest(url: NSURL(string: "http://xxxxx.xxx/" )! as URL)
request.httpMethod = "POST"
var postString = "xxxxxx"
request.httpBody = postString.data(using: String.Encoding.utf8)

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if error != nil {
return
}
guard let data = data else { return }

do {
let fetchedData = try JSONDecoder().decode([MyData].self, from: data)
self.pageTitle.append(fetchedData[x].xx)

DispatchQueue.main.async {
self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "pageviewcontroller") as! UIPageViewController
self.pageViewController.delegate = self
self.pageViewController.dataSource = self
self.pageViewController.view.frame = CGRect(x: 0, y: 65, width: view.frame.width, height: view.frame.height)
let startVC = self.viewControllerAtIndex(index: 0) as! ContentViewController
let viewControllers = NSArray(object: startVC)
self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .forward, animated: true, completion: nil)
self.addChildViewController(self.pageViewController)
self.view.addSubview(self.pageViewController.view)
self.pageViewController.didMove(toParentViewController: self)
}
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}
task.resume()
}


但是,请注意 CGRect 宽度和高度代码中的 view

self.pageViewController.view.frame = CGRect(x: 0, y: 65, width: view.frame.width, height: view.frame.height)

当你把这段代码放在'do' block 中时,view会带来歧义的错误。

然后将该代码修改为这个。

self.pageViewController.view.frame = CGRect(x: 0, y: 65, width: self.pageViewController.view.frame.width, height: self.pageViewController.view.frame.height)

希望对您有所帮助!

关于ios - Swift URLSession 在制​​作 PageView 之前无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53202488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com