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