Je transmets un identifiant de contact du contrôleur de table Contacts à un autre contrôleur de table Table Location. Je définis donc un délégué ContactSelectionDelegate et implémente la méthode userSelectedContact dans le contrôleur de table Location Location et j'obtiens contactIdentifierString
Je recherche la base de données pour trouver une correspondance pour contactIdentifierString et trouver une valeur pour un autre nom de fournisseur d'attribut. Cela implique une recherche dans toute la base de données. Existe-t-il un moyen plus rapide en attribuant un prédicat au contexte fetchRequest. Je pensais que ce serait plus rapide et moins de lignes de code.
Quelqu'un peut-il suggérer comment utiliser les prédicats avec contact fetchRequest?
Code ContactTableViewController:
protocol ContactSelectionDelegate{
func userSelectedContact(contactIdentifier:NSString)
}
class ContactTableViewController: UITableViewController {
var delegate:ContactSelectionDelegate? = nil
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if (delegate != nil){
let contactDict:NSDictionary = allContacts.object(at: indexPath.row) as! NSDictionary
let identifier = contactDict.object(forKey: "uniqueId")
delegate!.userSelectedContact(contactIdentifier: identifier as! NSString)
self.navigationController!.popViewController(animated: true)
}
}
}
Code LocationTableViewController:
class LocationTableViewController: UITableViewController, ContactSelectionDelegate, CLLocationManagerDelegate {
var contactIdentifierString:NSString = NSString()
func userSelectedContact(contactIdentifier: NSString) {
var fetchedResults: [Contact] = []
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
fetchedResults = try context.fetch(Contact.fetchRequest())
}
catch {
print ("fetch task failed")
}
if fetchedResults.count > 0 {
for contact in fetchedResults{
let aContact:Contact = contact
if (aContact.uniqueId! == contactIdentifierString as String) {
providerName.text = aContact.providerName
}
else {
continue
}
}
}
}
Tout d'abord, supprimez toutes les occurrences NSString
et NSDictionary
. C'est Swift !. Utilisez les structures natives Swift String
et Dictionary
.
Deuxièmement, mettez toujours tout bon code dans la portée do
d'une do - catch
bloquer.
Un prédicat CoreData a un format simple attribute == value
qui est très similaire à aContact.uniqueId! == contactIdentifierString
:
var contactIdentifierString = ""
func userSelectedContact(contactIdentifier: String) {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
let fetchRequest : NSFetchRequest<Contact> = Contact.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "uniqueId == %@", contactIdentifier)
let fetchedResults = try context.fetch(fetchRequest) as! [Contact]
if let aContact = fetchedResults.first {
providerName.text = aContact.providerName
}
}
catch {
print ("fetch task failed", error)
}
}
Le code suppose qu'il existe une sous-classe NSManagedObject
Contact
contenant
@nonobjc public class func fetchRequest() -> NSFetchRequest<Contact> {
return NSFetchRequest<Contact>(entityName: "Contact")
}