提前退出`CNContactStoreEnumerateContactsHandler`枚举

Sus*_*ver 4 xamarin.ios xamarin

你怎么早退出CNContactStoreEnumerateContactsHandlerstop被定义为一个布尔值不是一个对象/指针?

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

在ObjC/Swift中stop会是这样的UnsafePointer<ObjCBool>,因此:

ObjC: *stop = YES;

ObjC: stop.initialize....

迅速: stop.withUnsafePointer { p in p.memory = true }

Swift2: stop.memory = true

Iai*_*ith 5

我认为这可能是Xamarin.iOS中的一个错误,如果我们看一下NSSetEnumerator,它的委托签名如下所示:

public delegate Void NSSetEnumerator (NSObject obj, ref Boolean stop)
Run Code Online (Sandbox Code Playgroud)

我认为它需要ref关键字或你设置的值不会改变.

CNContactStoreEnumerateContactsHandler供参考

public delegate Void CNContactStoreEnumerateContactsHandler (CNContact contact,Boolean stop)
Run Code Online (Sandbox Code Playgroud)

我只是要用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;
});
Run Code Online (Sandbox Code Playgroud)

可能会发布此错误并立即修复其开源.