នៅមេរៀនយើងបានសិក្សារួចមកហើយ ដោយយើងទាញ data json ជា API ។ ឥឡូវនេះយើងមកសិក្សា data api ជាមួយ tableView
បង្កើត folder ថ្មីមួយ (New Group) រួចហើយដាក់ឈ្មោះថា Model => បន្ទាប់មកបង្កើត file swift ថ្មីមួយដោយយើងដាក់ឈ្មោះ Contact ដើម្បីផ្ទុក property នៃ variable

import Foundation class Contact{ var name: String var sex: String var phone: String init(name: String, sex: String, phone: String){ self.name = name self.sex = sex self.phone = phone } }
import Foundation class ContactService{ }
បង្កើត function មួយដោយយើងដាក់ឈ្មោះថា getContact ដែលមាន parameter ពីរ
import Foundation class contactService{ func getContact(){ } }
សរសេរកូដដើម្បីចាប់យក API

import Foundation class ContactService{ let URL_GET_CONTACT = "https://script.google.com/macros/s/AKfycby8gUI56dyvtSjUQjyZ9AaatT4AWBgIznyqt203dFv39AtYxPJ_5wTAyBHfSchypC8Yaw/exec" func getContact(name: String, phone: String, sex: String){ let url = URL(string: URL_GET_CONTACT) URLSession.shared.dataTask(with: url!) { data, response, error in if error == nil{ let jsonObject = try? JSONSerialization.jsonObject(with: data!, options: .fragmentsAllowed) let dict = jsonObject as! [String: Any] if dict["status"] as! Int == 200{ let data = dict["data"] as! NSArray //បង្កើត variable មួយសំរាប់ចាប់ទិន្ន័យ Contact រសប់ model var contacts = [Contact]() for d in data{ let a = d as! [String: Any] let name = a["NAME"] as! String let phone = a["PHONE"] as! String let sex = a["SEX"] as! String // map ជាមួយ model let contact = Contact(name: name, sex: sex, phone: phone) contacts.append(contact) } print(contacts.count) } } }.resume() } }
ដើម្បីឲ្យកូននឹង print ទៅវាដើរយើងត្រូវហៅ ឬ implement នៅក្នុង viewDidload()

import UIKit class ViewController: UIViewController { var contactService: ContactService! override func viewDidLoad() { super.viewDidLoad() let contactService = ContactService() contactService.getContact(name: "NAME", phone: "PHONE", sex: "SEX") } }
យើងធ្វើបានប៉ុន្នឹងហើយ ប៉ុន្តែយើងមិនអាចហៅ data ពី class ContactService មកប្រើបានទេ។ ដោយយើងត្រូវតែប្រើ function មួួយគឺ encaping closure ដោយយើងប្រើនៅក្នុង function getContact ដើម្បីបោះទិន្ន័យតាមវា
អ្វីទៅ encaping closure គឺជា closure ដែលយើងប្រើ closure ជា parameter របស់ fucntion និងវាដើរឬហៅនៅពេលដែលការងារមួយដើរចប់ ឬ function មួយដើរចប់។
syntax
(name parameter @escaping()->Void) // មាន parameter (name parameter @escaping(_ nameparet: [datatype])->Void)

import Foundation class ContactService{ let URL_GET_CONTACT = "https://script.google.com/macros/s/AKfycby8gUI56dyvtSjUQjyZ9AaatT4AWBgIznyqt203dFv39AtYxPJ_5wTAyBHfSchypC8Yaw/exec" func getContact(name: String, phone: String, sex: String, handle: @escaping(_ contact: [Contact])->Void){ let url = URL(string: URL_GET_CONTACT) URLSession.shared.dataTask(with: url!) { data, response, error in if error == nil{ let jsonObject = try? JSONSerialization.jsonObject(with: data!, options: .fragmentsAllowed) let dict = jsonObject as! [String: Any] if dict["status"] as! Int == 200{ let data = dict["data"] as! NSArray //បង្កើត variable មួយសំរាប់ចាប់ទិន្ន័យ Contact រសប់ model var contacts = [Contact]() for d in data{ let a = d as! [String: Any] let name = a["NAME"] as! String let phone = a["PHONE"] as! String let sex = a["SEX"] as! String // map ជាមួយ model let contact = Contact(name: name, sex: sex, phone: phone) contacts.append(contact) } handle(contacts) } } }.resume() } }
យើងបោះទិន្ន័យទៅ model តាមរយៈ escaping "@escaping(_ contact: [Contact])->Void){"
យើងមកសិក្សានៅខាង ViewController យើងវិញម្តង។ ដោយយើងហៅទិន្ន័យចេញពី Model មកប្រើ

បោះទិន្ន័យចូលទៅក្នុង TableView
យើងបង្កើត tableView

import UIKit class ViewController: UIViewController,UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! var contactService: ContactService! //បង្កើត variable ចំទទួលទិន្ន័យ escaping var contacts = [Contact]() override func viewDidLoad() { super.viewDidLoad() let contactService = ContactService() contactService.getContact(name: "NAME", phone: "PHONE", sex: "SEX") { contact in //ដោះទិន្ន័យចូល varaible ទុកប្រើជាមួយ table self.contacts = contact DispatchQueue.main.async { self.tableView.reloadData() } } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return contacts.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") cell?.textLabel?.text = contacts[indexPath.row].phone cell?.detailTextLabel?.text = contacts[indexPath.row].name cell?.textLabel?.font = UIFont.systemFont(ofSize: 22.0) cell?.detailTextLabel?.font = UIFont.systemFont(ofSize: 20.0) return cell! } }
0 Comments