2016-05-02 12 views
4

CNContactStoreEnumerateContactsHandlerを早期終了する方法stopはオブジェクト/ポインタではなくブール値として定義されていますか? ObjC /スウィフトstop早期終了「CNContactStoreEnumerateContactsHandler」列挙

var successfulEnumeration = store.EnumerateContacts(fetchRequest, out error, (contact, stop) => 
{ 
     stop = true; // this does nothing of course 
}); 

のでUnsafePointer<ObjCBool>とのようになります。

にObjC:*stop = YES;

にObjC:stop.initialize....

スウィフト:stop.withUnsafePointer { p in p.memory = true }

Swift2:stop.memory = true

+0

+1 EnumerateContactsがどのように機能するかについての良い例を提供するために、Xamarinのドキュメントはこれに照らして軽いものでした。 –

答えて

4

私たちはNSSetEnumeratorを見ればそのデリゲートのシグネチャは次のようになり、これはXamarin.iOSで間違いかもしれないと思う:

public delegate Void NSSetEnumerator (NSObject obj, ref Boolean stop) 

私はそれがREFキーワードまたはあなたが文句を言わない変更を設定された値を必要だと思います。参照

public delegate Void CNContactStoreEnumerateContactsHandler (CNContact contact,Boolean stop) 

イムため

CNContactStoreEnumerateContactsHandlerはちょうど停止を設定するとき、それが停止したかどうかを確認するためにNSSetEnumeratorでテストを実行する予定。

更新 あなたは下のコードを実行した場合、あなたはそれが5に当たったとき、それが実際に停止していることがわかります。

NSSet set = new NSSet<NSNumber> (new []{ 
    new NSNumber(1), 
    new NSNumber(2), 
    new NSNumber(3), 
    new NSNumber(4), 
    new NSNumber(5), 
    new NSNumber(6), 
    new NSNumber(7), 
    new NSNumber(8), 
    new NSNumber(9) 
}); 

set.Enumerate ((NSObject obj, ref bool stop) => { 

    var num = obj as NSNumber; 

    if (num.Int32Value == 5) 
     stop = true; 
}); 

はバグとしてこれを投稿することができ、現在はそのオープンソースを修正する可能性があります。

+0

ありがとう、私はポインタ( 'ref')にそれを期待していたかもしれないが、おそらく私はちょうどこの1つの脳fartingだったと思った...私は現在それを抜けて、すべてをきれいにするダブルtry/catchを使用しています...醜いが、それを働かせるために何かをしなければならなかった。たぶん、Xamarinの開発者の一人がこれに着目します。 – SushiHangover

+0

私はpull-request @ https://github.com/xamarin/xamarin-macios/pull/19を作成しました – SushiHangover

+0

'バグ'ですか、それはパブリックAPIに変更するだけの変更です既存のデリゲートを廃止し、別のものを追加...しかし、それは良い;-)ので固定されます – SushiHangover

関連する問題