提前退出`CNContactStoreEnumerateContactsHandler`枚举

时间:2016-05-02 23:03:19

标签: xamarin xamarin.ios

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

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

在ObjC / Swift中stop类似于UnsafePointer<ObjCBool>,因此:

ObjC:*stop = YES;

ObjC:stop.initialize....

斯威夫特:stop.withUnsafePointer { p in p.memory = true }

Swift2:stop.memory = true

1 个答案:

答案 0 :(得分:5)

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

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

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

CNContactStoreEnumerateContactsHandler以供参考

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

可能会将此作为错误发布并立即修复其开源。