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/Swiftstop
中,类似于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的文档对此进行了说明。