Xamarin 提前退出'CNContactStoreEnumerationContactsHandler'枚举

Xamarin 提前退出'CNContactStoreEnumerationContactsHandler'枚举,xamarin,xamarin.ios,Xamarin,Xamarin.ios,当stop被定义为布尔值而不是对象/指针时,如何提前退出CNContactStoreEnumerateContactsHandler var successfulEnumeration = store.EnumerateContacts(fetchRequest, out error, (contact, stop) => { stop = true; // this does nothing of course }); 在ObjC/Swiftstop中,类似于Uns

stop
被定义为布尔值而不是对象/指针时,如何提前退出
CNContactStoreEnumerateContactsHandler

var successfulEnumeration = store.EnumerateContacts(fetchRequest, out error, (contact, stop) =>
{
        stop = true; // this does nothing of course  
});
在ObjC/Swift
stop
中,类似于
UnsafePointer
,因此:

ObjC:
*停止=是

ObjC:
停止。初始化…

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


Swift2:
stop.memory=true

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

public delegate Void NSSetEnumerator (NSObject obj, ref Boolean stop)
我认为它需要ref关键字,否则设置的值不会改变

供参考

public delegate Void CNContactStoreEnumerateContactsHandler (CNContact contact,Boolean stop)
我只是想用NSSetEnumerator运行一个测试,看看它在设置stop时是否停止

更新 如果您运行下面的代码,您将看到它在达到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;
});
NSSet=new NSSet(new[]{
新编号(1),
新编号(2),
新编号(3),
新编号(4),
新编号(5),
新编号(6),
新编号(7),
新编号(8),
新编号(9)
});
集合枚举((NSObject obj,ref bool stop)=>{
var num=作为NSNumber的obj;
如果(num.Int32Value==5)
停止=真;
});

可能会将此作为一个bug发布,并立即修复其开源版本。

谢谢,我本来希望它是一个指针(
ref
),但我想我可能只是在这个问题上放屁。。。我目前正在使用双重尝试/捕获来摆脱它并清理一切。。。很难看,但必须做点什么才能让它工作。也许某个Xamarin开发人员会插话进来。这是一个
错误
,但仅仅更改公共api是一个突破性的改变,因此他们必须淘汰现有的委托并添加另一个。。。但它将得到修复,因此很好;-)太棒了,他们很快就回来了,很好的发现!是的,我不认为有任何干净的解决办法。好问题。已经修复了@当然,在阿尔法周期内发布该版本需要时间,…,但伟大的回头时间+1为了提供一个关于EnumerateContacts如何工作的好例子,Xamarin的文档对此进行了说明。