2017-01-13 3 views
2

コンタクト識別子をコンタクトテーブルビューコントローラから別のロケーションテーブルビューコントローラに渡します。そこで、私は代理人のContactSelectionDelegateを定義し、Location tableview controllerのメソッドuserSelectedContactを実装し、contactIdentifierStringを取得します。コアデータにfetchRequestで述語を使用する方法

私はデータベースを検索して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 
      } 
     } 
    } 


} 

答えて

9

まず第一には、すべてのNSStringNSDictionary出現を取り除きます。これはスウィフトです! Swiftネイティブ構造体StringおよびDictionaryを使用してください。

第2のすべては常に良いコードをブロックのdoのコードに入れます。

A CoreData述語はaContact.uniqueId! == contactIdentifierStringに非常によく似ている簡単な形式attribute == valueがあります

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) 
    } 

} 

コードは、私がこのライン上のエラーの接触を取得

@nonobjc public class func fetchRequest() -> NSFetchRequest<Contact> { 
    return NSFetchRequest<Contact>(entityName: "Contact") 
} 
+0

含むNSManagedObjectサブクラスContactがあることを前提としてい: "Ambiguoiusのfetchrequestの使用"。 fetchRequest = Contact.fetchRequest()を – vrao

+0

に変更します。let req:NSFetchRequest = Contact.fetchRequest()。今私はエラーが発生します:宣言されていない型NSFetchRequestの使用。私はNSManagedObjectサブクラスを持っていないように見えます。したがって、生成されたNSManagedObjectは、両方のエンティティのサブクラスです。 Contact + CoreDataProperties.swift内の連絡先エンティティで「連絡先がこのコンテキストでタイプルックアップにあいまいです」というエラーが表示されます。 NSManagedObjectクラスが自動生成されている可能性があります。エラーで円を描くあなたpl。説明し、修正する方法? – vrao

+1

'providerName'がドット表記でアクセスされるので、NSManagedObjectサブクラスを使用していると仮定していました。サブクラスには 'fetchRequest()'メソッドが含まれていなければなりません。私は答えを更新しました。 – vadian

関連する問題