Не используйте пользовательский класс. Используйте только предоставленный класс User
.
Прежде всего объявите массив источника данных (заменив displayDatasssss
)
var users = [User]()
В методе tap
загрузите данные и вставьте новый элементы в стеке основных данных. Учтите, что каждое нажатие на кнопку вставляет дубликаты в базу данных. Старые записи не удаляются.
Поскольку User
имеет только name
, а id
свойства email
назначены id
.
Элементы добавляются в источник данных. и сохранить в контексте.
@IBAction func tap(_ sender: Any) {
let url = "http://jsonplaceholder.typicode.com/users")!
let task = session.dataTask(with: url){ [unowned self] (data, response,error)in
if let error = error { print(error); return }
do {
// Array of Data
let fetchData = try JSONSerialization.jsonObject(with: data!) as! [[String:Any]]
for eachDataItem in fetchData {
let name = eachdataitem["name"] as! String
let email = eachdataitem["email"] as! String
let newUser = User(context: self.context)
newUser.name = name
newUser.id = email
self.users.append(newUser)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
try self.context.save()
} catch{
print("Error 2", error)
}
}
task.resume()
}
В viewDidLoad
извлечь данные из CoreData
и перезагрузить представление таблицы
override func viewDidLoad() {
super.viewDidLoad()
do {
let request : NSFetchRequest<User> = User.fetchRequest()
users = try context.fetch(request)
tableView.reloadData()
} catch { print(error) }
}
В cellForRow
назначить значение свойства ( s) к меткам, ничего больше
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1
let user = users[indexPath.row]
cell.label.text = user.name
return cell
}
Метод удаления очень похож на ваш
let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { [unowned self] (action, indexPath) in
print("Delete tapped")
// remove the deleted item from the model
let objectToDelete = self.users.remove(at: indexPath.row)
self.context.delete(objectToDelete)
do {
try self.context.save()
self.tableView.deleteRows(at: [indexPath], with: .automatic)
} catch {
print(error)
}
}
return [editAction, deleteAction]
Примечание: Печатайте всегда ошибки, не игнорируйте их и не печатайте только бессмысленные буквенные строки