web-dev-qa-db-ja.com

Core DataでfetchRequestで述語を使用する方法

連絡先識別子を連絡先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
            }
        }
    }


}
7
vrao

まず、すべての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")
}
21
vadian