swift中填充结构的线程和并发性

swift中填充结构的线程和并发性,swift,Swift,我在这里面临的问题是,我想用分页的主题填充/填充我的FilteredPost。但当我试着去做,并检查计数时,它等于0。我也试着在viewWillApear中这样做,但情况是一样的。据我所知,它与线程和并发性有关 import UIKit import WebKit class WelcomeScreen: UITableViewController, NetworkManagerDelegate, WKNavigationDelegate,UISearchBarDelegate {

我在这里面临的问题是,我想用分页的主题填充/填充我的FilteredPost。但当我试着去做,并检查计数时,它等于0。我也试着在viewWillApear中这样做,但情况是一样的。据我所知,它与线程和并发性有关

import UIKit
import WebKit

class WelcomeScreen: UITableViewController, NetworkManagerDelegate, WKNavigationDelegate,UISearchBarDelegate {
    
    @IBOutlet weak var searchBar: UISearchBar!
    private var networkManager = NetworkManager()
    private var posts = [Article]()
    private var paginatedPosts: [Article] = []
    private var filteredPosts: [Article] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        
        filteredPosts = paginatedPosts
        print(filteredPosts.count)
        
        self.tableView.register(UINib(nibName: "ArticleViewCell", bundle: nil), forCellReuseIdentifier: "customCell")
        
        searchBar.delegate = self
        
        networkManager.delegate = self
        networkManager.fetchNews("us")
    }

    // MARK: - Table view data source
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {        
        return filteredPosts.count
    }
    
    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        guard indexPath.row != posts.count - 1 else { return }
        if indexPath.row == paginatedPosts.count - 1 {
            let startIndex = paginatedPosts.count
            let endIndex = startIndex + 9
            
            if endIndex <= posts.count {
                paginatedPosts.append(contentsOf: posts[startIndex...endIndex])
                tableView.reloadData()
            }
        }
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as?  ArticleViewCell else{
            return UITableViewCell(style: .default, reuseIdentifier: "cell")
        }
        
        let post = paginatedPosts[indexPath.row]
        cell.timePosted.text = post.publishedFormattedDateString
        cell.author.text = "by: \(post.author ?? "Author Unknown")"
        cell.title.text = post.articleDescription
        
        if let image = post.urlToImage {
            cell.imageForArticle.load(url: image)
        }
        
        return cell   
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard let url = paginatedPosts[indexPath.row].url else{
            fatalError()
        }
        let webVC = WebViewController(url: url, title: paginatedPosts[indexPath.row].title)
        let navVC = UINavigationController(rootViewController: webVC)
        navVC.modalPresentationStyle = .fullScreen
        present(navVC, animated: true)
    }
    
    func didUpdateNews(root: Root) {
        posts = root.articles
        
        paginatedPosts = posts.count >= 10 ? Array(posts[0...9]) : posts
        
        filteredPosts = paginatedPosts
    }
    
    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        filteredPosts = []
        if searchBar.text == ""{
            filteredPosts = paginatedPosts
        } else {
            for item in posts{
                if ((item.articleDescription?.lowercased().contains(searchBar.text!)) != nil){
                    filteredPosts.append(item)
                }
            }
        }
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}
导入UIKit
导入WebKit
类WelcomeScreen:UITableViewController、NetworkManagerDelegate、WKNavigationDelegate、UISearchBarDelegate{
@ibvar搜索栏:UISearchBar!
专用变量networkManager=networkManager()
私有var posts=[文章]()
private var paginatedPosts:[文章]=[]
私有var filteredPosts:[文章]=[]
重写func viewDidLoad(){
super.viewDidLoad()
filteredPosts=分页的posts
打印(filteredPosts.count)
self.tableView.register(UINib(nibName:“ArticleViewCell”,bundle:nil),强制重用标识符:“customCell”)
searchBar.delegate=self
networkManager.delegate=self
networkManager.fetchNews(“美国”)
}
//标记:-表视图数据源
重写func numberOfSections(在tableView:UITableView中)->Int{
返回1
}
重写func tableView(tableView:UITableView,numberOfRowsInSection:Int)->Int{
返回filteredPosts.count
}
重写func tableView(tableView:UITableView,willDisplay单元格:UITableViewCell,forRowAt indexath:indexPath){
guard indexath.row!=posts.count-1 else{return}
如果indexath.row==paginatedPosts.count-1{
让startIndex=paginatedPosts.count
设endIndex=startIndex+9
如果endIndex UITableViewCell{
guard let cell=tableView.dequeueReusableCell(标识符为:“customCell”,用于:indexPath)作为?ArticleViewCell-else{
返回UITableViewCell(样式:。默认值,reuseIdentifier:“单元格”)
}
让post=paginatedPosts[indexPath.row]
cell.timePosted.text=post.publishedFormattedDataTestRing
cell.author.text=“作者:\(post.author???“作者未知”)
cell.title.text=post.articlescription
如果let image=post.urlToImage{
cell.imageForArticle.load(url:image)
}
返回单元
}
重写func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
guard let url=paginatedPosts[indexPath.row].url-else{
法塔莱罗()
}
让webVC=WebViewController(url:url,标题:paginatedPosts[indexath.row].title)
让navVC=UINavigationController(rootViewController:webVC)
navVC.modalPresentationStyle=.fullScreen
当前(navVC,动画:真)
}
func didUpdateNews(根:根){
posts=root.articles
paginatedPosts=posts.count>=10?数组(posts[0…9]):posts
filteredPosts=分页的posts
}
func searchBarTextDidBeginEditing(searchBar:UISearchBar){
filteredPosts=[]
如果searchBar.text==“”{
filteredPosts=分页的posts
}否则{
关于员额中的项目{
if((item.articlescription?.lowercased().contains(searchBar.text!))!=nil){
filteredPosts.append(项目)
}
}
}
DispatchQueue.main.async{
self.tableView.reloadData()
}
}
}

您需要将
func didUpdateNews
更改为


func didUpdateNews(根:根){
posts=root.articles
paginatedPosts=posts.count>=10?数组(posts[0…9]):posts
filteredPosts=分页的posts
DispatchQueue.main.async{
self.tableView.reloadData()
}
}

我试过了,当我打印过滤后的帖子时,确实有10篇,但当我在viewdidload中打印它们时,其中有0篇,这是因为您正在将它们初始化为空数组:
paginatedPosts:[Article]=[],filteredPosts:[Article]=[]
然后调用
networkManager.fetchNews(“我们”)
但是这个调用的结果是异步的,所以直到
didUpdateNews
作为
fetch
的结果被调用之前,你都会有空的数组。不太明白,我是否必须以某种方式重构我的数据?你可以预取帖子,然后在
viewDidLoad
上进行预取。或者你可以使
fetch
同步但是
线程
将被阻止,因此这不是最好的方法。当前使用
异步
调用的方法很好,只需在通过
networkManager
委托获得回调时更新数据和
tableView