I have many URLs that I have to scrape from the website. After I get them from my bundle file I create an array that includes many URLs. I passed this array my function which is called scrapeSanatcilar and I add completion handler there but something going wrong. I just want to get some random elements from my array after it has filled with data :(
I call scrapeWithPage in my viewdidLoad.
func scrapeWithPage(){
let path = Bundle.main.path(forResource: "SanatciLink", ofType: "txt")!
let text = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)
var links = text.components(separatedBy: CharacterSet.newlines)
links.removeLast()
scrapSanatcilar(links: links) { (result) in
print(result.randomElement())
}
}
func scrapeSanatcilar(links: [String], completionHandler: @escaping (_ result: [String]) -> Void){
for link in links{
let baseUrl = link
let url = URL(string: baseUrl)!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {
self.makeAlert(titleInput: "Hata!", messageInput: "Üzgünüz ancak bir sorun oluştu lütfen daha sonra tekrar deneyin")
return
}
guard let htmlString = String(data: data, encoding: .utf8) else {
self.makeAlert(titleInput: "Hata!", messageInput: "Üzgünüz ancak bir sorun oluştu lütfen daha sonra tekrar deneyin")
return
}
guard let songs: Elements = try? SwiftSoup.parse(htmlString).getElementsByClass("artist-list") else {return}
do{
let hrefs : Elements = try songs.select("a")
for href in hrefs{
self.scrapeSanatciNameWithPageLinks.append(try href.text())
self.scrapeSarkiNameWithPageLinks.append(try href.attr("href"))
}
}catch{
}
};task.resume()
}
completionHandler(self.scrapeSanatciNameWithPageLinks)
}
Please move your completionHandler into your Task because the Asynchronous like this: