2017-01-13 3 views
2

연락처 테이블 뷰 컨트롤러에서 연락처 식별자를 다른 위치 테이블 뷰 컨트롤러로 전달합니다. 그래서 delegate 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!입니다. Swift 네이티브 구조체 StringDictionary을 사용하십시오. 모든

둘째는 do - catch 블록의 do 범위에 항상 모든 좋은 코드를 삽입.

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 사용". let fetchRequest = Contact.fetchRequest() – vrao

+0

let req : NSFetchRequest = Contact.fetchRequest(). 이제 오류가 발생합니다 : 선언되지 않은 형식의 NSFetchRequest 사용. NSManagedObject 하위 클래스가없는 것 같습니다. 그래서 생성 된 NSManagedObject 두 하위 항목 모두에 대한 하위 클래스. Contact + CoreDataProperties.swift 내 연락처 엔티티에서 "연락처가이 컨텍스트에서 유형 조회에 모호합니다"라는 오류가 표시됩니다. NSManagedObject 클래스가 자동 생성 될 수 있습니다. 오류가있는 순환. 너 pl 할 수 있니? 설명하고 수정하는 방법? – vrao

+1

'providerName'이 점 표기법으로 액세스되기 때문에 NSManagedObject 서브 클래스를 사용하고 있다고 가정합니다. 서브 클래스는 fetchRequest() 메소드를 포함해야한다. 나는 대답을 업데이트했다. – vadian

관련 문제