連絡先識別子を連絡先Tableview Controllerから別のロケーションTableview Controllerに渡します。したがって、デリゲートContactSelectionDelegateを定義し、Location tableview controllerにメソッドuserSelectedContactを実装し、contactIdentifierStringを取得します。
データベースを検索して、contactIdentifierStringに一致するものを見つけ、別の属性プロバイダー名の値を見つけています。これには、データベース全体の検索が含まれます。コンテキストfetchRequestに述語を割り当てることにより、より高速な方法はありますか。私はそれがより速く、より少ないコード行になると思った。
誰かが連絡先fetchRequestで述語を使用する方法を提案できますか?
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)
}
}
}
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
}
}
}
}
まず、すべてのNSString
およびNSDictionary
の出現を取り除きます。これはSwift!です。 Swiftネイティブ構造体String
およびDictionary
を使用します。
第二に、常にすべてを置くgooddo - catch
ブロックのdo
スコープ内のコード。
CoreDataの述語には、attribute == value
と非常によく似た単純な形式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)
}
}
コードは、次を含むNSManagedObject
サブクラスContact
があると想定しています
@nonobjc public class func fetchRequest() -> NSFetchRequest<Contact> {
return NSFetchRequest<Contact>(entityName: "Contact")
}