Early exit of `CNContactStoreEnumerateContactsHandler` Enumeration

How do you get out early because CNContactStoreEnumerateContactsHandlerit stopis defined as a boolean, not an object / pointer?

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

ObjC / Swift stopwill be something like UnsafePointer<ObjCBool>and like this:

ObjC: *stop = YES;

ObjC: stop.initialize....

Swift: stop.withUnsafePointer { p in p.memory = true }

Swift2: stop.memory = true

+4
source share
1 answer

I think this may be a bug in Xamarin.iOS. If we look at the NSSetEnumerator , then her delegate signature will look like this:

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

I think he needs the ref keyword or the value you set will not change.

CNContactStoreEnumerateContactsHandler for reference

public delegate Void CNContactStoreEnumerateContactsHandler (CNContact contact,Boolean stop)

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

, .

+4

All Articles