2016-06-18 19 views
3

新しく作成した連絡先の識別子が保存要求の直後に必要です。ユースケース:私のアプリ内で、ユーザーは新しい連絡先を作成し、連絡先を保存できるようになった後にいくつかの属性(たとえば、名前、住所など)を与えます。このシナリオは、アスペクトとして機能しています。私のコードは次のようになります:iOS9連絡先新しく保存された連絡先から識別子を取得する

func createContact(uiContact: Contact, withImage image:UIImage?, completion: String -> Void) 
    {  
     let contactToSave = uiContact.mapToCNContact(CNContact()) as! Cnmutablecontawctlet 
     if let newImage = image 
     { 
      contactToSave.imageData = UIImageJPEGRepresentation(newImage, 1.0) 
     } 
     request   = CNSaveRequest() 
     request.addContact(contactToSave, toContainerWithIdentifier: nil) 
     do 
     { 
      try self.contactStore.executeSaveRequest(request) 
      print("Successfully saved the CNContact") 
      completion(contactToSave.identifier) 
     } 
     catch let error 
     { 
     print("CNContact saving faild: \(error)") 
     completion(nil) 
     } 
    } 

コンタクトオブジェクト(uiContact)はCNContactの単なるラッパーです。 終了時に識別子を返す必要がありますが、この時点では、書き込み処理後にシステムが作成しているため、アクセスできません。 一つの解決策は、述語

public func unifiedContactsMatchingPredicate(predicate: NSPredicate, keysToFetch keys: [CNKeyDescriptor]) throws -> [CNContact] 

に新しく保存されたCNContactを取得することができるが、この接触は名前だけ、1つが存在する可能性以上のものを持っている可能性があるため、これは汚れたビットのように私には思えます。作成された識別子を持つコールバックのようなものは素晴らしいでしょう。しかし、そうではありません。 この問題を解決する他の方法はありますか?

答えて

1

これは少し遅れているかもしれませんが、誰かがこれを必要とする場合があります。

NSError *error = nil; 

saveReq = [[CNSaveRequest alloc] init]; 
[saveReq addContact:cnContact toContainerWithIdentifier:containerIdentifier]; 

if (![contactStore executeSaveRequest:saveReq error:&error]) { 
    NSLog(@"Failed to save, error: %@", error.localizedDescription); 
} 
else 
{ 
    if ([cnContact isKeyAvailable:CNContactIdentifierKey]) { 
     NSLog(@"identifier for new contact is: %@", cnContact.identifier); 
     // this works for me everytime 
    } else { 
     NSLog(@"CNContact identifier still isn't available after saving to address book"); 
    } 
} 
:最新のSDK(iOSの11)を使用することにより

、私はちょうどで識別子を取得することができました

関連する問題