gpt4 book ai didi

ios - 将服务器响应加载到 UICollectionView

转载 作者:搜寻专家 更新时间:2023-11-01 06:13:22 25 4
gpt4 key购买 nike

我有一个 UIViewController 类,我试图在其中将数据填充到我的 UICollectionView 中

//  HomeController.swift


import UIKit
import SwiftyJSON

class HomeController: UICollectionViewController,
UICollectionViewDelegateFlowLayout, TaskServiceManagerDelegate {
func didUpdate(sender: TaskServiceManager) {
self.collectionView?.reloadData()
}

var taskList:JSON? = nil

override func viewDidLoad() {
super.viewDidLoad()

// getting the task list to populate the UICollectionView
let taskServiceManager:TaskServiceManager = TaskServiceManager()
taskList = taskServiceManager.getAllTasks()
collectionView?.dataSource = self;
collectionView?.delegate = self;
navigationItem.title = "Test"
collectionView?.backgroundColor = UIColor.lightGray
collectionView?.register(QuestionCell.self, forCellWithReuseIdentifier: "cellId")
}

override func viewDidAppear(_ animated: Bool) {

}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// getting the task list to populate the UICollectionView
let taskServiceManager:TaskServiceManager = TaskServiceManager()
taskList = taskServiceManager.getAllTasks()
collectionView?.dataSource = self;
collectionView?.delegate = self;
}

override func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return (taskList?.count)!
}
}

我有另一个类 TaskServiceManager,我在其中进行 REST api 调用并获取数据。

//  TaskServiceManager.swift

import UIKit
import Alamofire
import SwiftyJSON

class TaskServiceManager : NSObject{

var delegate: TaskServiceManagerDelegate?


func getAllTasks() -> JSON {
var swiftyJsonVar: JSON = []
Alamofire.request(url, headers: getHeaders()).responseJSON { (responseData) -> Void in
print("Status Code: \(responseData.response?.statusCode)")
if((responseData.result.value) != nil) {
swiftyJsonVar = JSON(responseData.result.value!)
print(swiftyJsonVar)
print("Task List Count: \(swiftyJsonVar.array?.count)")
}
}
return swiftyJsonVar
}

}

protocol TaskServiceManagerDelegate {
func didUpdate(sender: TaskServiceManager)
}

numberOfItemsInSection 中的 taskList?.count 返回 0,即使我从 api 响应中获得成功且计数为 6。为什么会这样?

如何从 TaskServiceManager 类引用 HomeController?

此外,为什么我的 TaskServiceManagerDelegate 不反射(reflect) UICollectionView?

最佳答案

不需要委托(delegate)从API获取数据,completion handlers是这类任务的更好选择。

在您的函数中进行此更改:

func getAllTasks(completion:@escaping(JSON)->()) {
var swiftyJsonVar: JSON = []
Alamofire.request(url, headers: getHeaders()).responseJSON { (responseData) -> Void in
print("Status Code: \(responseData.response?.statusCode)")
if((responseData.result.value) != nil) {
swiftyJsonVar = JSON(responseData.result.value!)
print(swiftyJsonVar)
print("Task List Count: \(swiftyJsonVar.array?.count)")
completion(swiftyJsonVar)
}
}
}

从你的另一个类调用它:

TaskServiceManager().getAllTasks { (tasks) in
print("tasks : \(tasks)")
//here reload your collection view
}

除了 return 语句之外,您所做的一切都是正确的。 API 调用是异步,因此您的返回语句会在您的网络请求结束之前被调用。你需要一个 completion callback 来在你得到响应时返回数据。

并且您的授权不完整。如果你想要委托(delegate)方法,那么你需要添加这些行。

在 viewDidLoad() 之后:

let taskServiceManager:TaskServiceManager = TaskServiceManager()

您需要将 HomeController 的实例分配给 TaskServiceManager 类的委托(delegate)变量

taskServiceManager.delegate = self

在 TaskServiceManager 类中,当您从服务器获取数据时,您需要使用委托(delegate)方法传递它,我不知道您为什么要尝试在委托(delegate)方法中传递 TaskServiceManager 的实例?

protocol TaskServiceManagerDelegate {
func didUpdate(sender: TaskServiceManager) // Why ?
// func didUpdate(serverData: JSON) // Maybe this is what you need
}

在没有任何 return 语句的情况下调用委托(delegate)方法的最后一步:

func getAllTasks() {
var swiftyJsonVar: JSON = []
Alamofire.request(url, headers: getHeaders()).responseJSON { (responseData) -> Void in
print("Status Code: \(responseData.response?.statusCode)")
if((responseData.result.value) != nil) {
swiftyJsonVar = JSON(responseData.result.value!)
print(swiftyJsonVar)
print("Task List Count: \(swiftyJsonVar.array?.count)")
delegate.didUpdate(serverData: swiftyJsonVar) // this is to pass data
}
}
}

现在将调用 HomeController 中的这个函数(我将数据更改为 serverData 而不是 TaskServiceManager):

func didUpdate(serverData: dataFormServer) {
print("dataFormServer : \(dataFormServer)")
self.collectionView?.reloadData()
}

关于ios - 将服务器响应加载到 UICollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50404928/

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