gpt4 book ai didi

ios - 选择要加载到 TableView Swift 中的数据

转载 作者:行者123 更新时间:2023-11-29 00:57:22 25 4
gpt4 key购买 nike

我有一个 TableView Controller ,单元格上方是一个分段控件。分段控制有 3 个选项。过去的帖子、当前的帖子和 future 的帖子。我试图弄清楚如何根据在分段控件上选择的索引将特定数据加载到 TableView 中。

例如,如果选择了 Past Posts,我想将 Parse Server 中的 Past Post 数据加载到 TableView 中。或选择 Future Posts 将 Parse Server 中的 Future Posts 日期加载到 TableView 中。

我完全不确定如何加载“选定”数据,然后在索引更改时删除并加载不同的数据。非常感谢任何帮助!

另外,我知道如何从 Parse Server 获取数据。我提到这一点只是为了解释我的数据来自何处。

最佳答案

我会做一些事情来创建一个 Controller 来执行获取、解析并返回一个带有关联标识符的闭包(如果它发生变化),您仍然可以使用这种方法。类似的东西。

更新

Rob's answer 的帮助下为了完整起见,我想在我的回答中加入一些背景信息。

typealias PostsCompletionClosure = (requestIdentifier : String, posts : [Post])->Void

class PostController {

func fetchPastPosts(requestIdentifier : String,
completion : PostsCompletionClosure,
queue : dispatch_queue_t?) {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

let queryParams = ["status" : "past"]

self.performQuery(queryParams, completion: { (requestID, posts) in
dispatch_async(queue != nil ? queue : dispatch_get_main_queue()) {
completion(requestIdentifier : requestIdentifier, posts : posts)
}
})
}
}

func fetchCurrentPosts(requestIdentifier : String,
completion : PostsCompletionClosure,
queue : dispatch_queue_t?) {
// Same as Above
}

func fetchFuturePosts(requestIdentifier : String,
completion : PostsCompletionClosure,
queue : dispatch_queue_t?) { {
// Same as Above
}

private func performQuery(queryParams: [String : String],
completion : PostsCompletionClosure) {

let query = PFQuery(className: "Posts")

for {key, value) in queryParams {
query.whereKey(key, equalTo: value)
}

query.findObjectsInBackgroundWithBlock { objects, error in
guard let error == nil else {
// Handle Error
return
}

if let results = objects as? [Post] {
dispatch_get_main_queue()) {
completion(requestIdentifier : requestIdentifier, posts : posts)
}
})
}
}

您甚至可以为段请求创建一个发布请求队列,如果您要开始一个新的请求,则取消所有先前的操作,这样一开始就不会给它重新加载数据的机会。


这是关于如何实现 viewController 的可能方法:)

class ViewController: UIViewController, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!
@IBOutlet var segnmentControl: UISegmentedControl!

var posts: [Post]?
var activeRequestId: String = ""

// This should prolly be injected or a singleton
let postsController = PostController()

override func viewDidLoad() {
super.viewDidLoad()
didSelectSelegment(segnmentControl)
}

@IBAction func didSelectSelegment(sender: UISegmentedControl) {
posts = nil
tableView.reloadData()

activeRequestId = "\(sender.selectedSegmentIndex)"

switch sender.selectedSegmentIndex {
case 0:
self.postsController.fetchPastPosts(activeRequestId, completion: { (requestIdentifier, posts) in
self.reloadDataWith(requestIdentifier, posts : [Post])
})
case 1:
self.postsController.fetchCurrentPosts(activeRequestId, completion: { (requestIdentifier, posts) in
self.reloadDataWith(requestIdentifier, posts : [Post])
})
case 2:
self.postsController.fetchFuturePosts(activeRequestId, completion: { (requestIdentifier, posts) in
self.reloadDataWith(requestIdentifier, posts : [Post])
})
default:
fatalError("unexpected segment index")
}
}

func reloadDataWith(requestIdentifier : String,
posts : [Post]) {

if self.requestIdentifier == requestIdentifier {
self.posts = posts
self.tableView.reloadData()
}
}
}

关于ios - 选择要加载到 TableView Swift 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37495560/

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