首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoMac NSWorkspace.RecycleUrls vs.:completionHandler

MonoMac NSWorkspace.RecycleUrls vs.:completionHandler
EN

Stack Overflow用户
提问于 2012-11-19 12:35:38
回答 1查看 295关注 0票数 1

根据MonoMac文档NSWorkspace.RecycleUrls的签名是:

代码语言:javascript
复制
[MonoMac.Foundation.Export("recycleURLs:completionHandler:")]
public virtual void RecycleUrls (MonoMac.Foundation.NSDictionary urls, NSWorkspaceUrlHandler completionHandler)

根据NSWorkspacerecycleURLs:completionHandler的签名是:

代码语言:javascript
复制
- (void)recycleURLs:(NSArray *)URLs completionHandler:(void (^)(NSDictionary *newURLs, NSError *error))handler

我有一系列的URL,我想要回收。

这里我很困惑--苹果文档说第一个参数是NSArray,但MonoMac想要一个NSDictionary。构造NSDictionary的所有函数都需要键和值(不足为奇),而我只有值。

除了将MonoMac的RecycleUrls实现(转载于下文)并将其重写为使用NSArray之外,还有什么要做的吗?

代码语言:javascript
复制
[Export("recycleURLs:completionHandler:")]
public unsafe virtual void RecycleUrls(NSDictionary urls, NSWorkspaceUrlHandler completionHandler)
{
    if (urls == null)
    {
        throw new ArgumentNullException("urls");
    }
    if (completionHandler == null)
    {
        throw new ArgumentNullException("completionHandler");
    }
    BlockLiteral blockLiteral = default(BlockLiteral);
    blockLiteral.SetupBlock(NSWorkspace.static_InnerNSWorkspaceUrlHandler, completionHandler);
    if (this.IsDirectBinding)
    {
        Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, NSWorkspace.selRecycleURLsCompletionHandler_, urls.Handle, (IntPtr)((void*)(&blockLiteral)));
    }
    else
    {
        Messaging.void_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, NSWorkspace.selRecycleURLsCompletionHandler_, urls.Handle, (IntPtr)((void*)(&blockLiteral)));
    }
    blockLiteral.CleanupBlock();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-21 01:09:39

Mono的绑定是不正确的,我将NSWorkspace.RecycleUrls()NSWorkspace.DuplicateUrls()改为NSArray而不是NSDictionary单组分提交b1eda57

这是生成的代码:

代码语言:javascript
复制
    [Export ("recycleURLs:completionHandler:")]
    public unsafe virtual void RecycleUrls (NSArray urls, NSWorkspaceUrlHandler completionHandler)
    {
        if (urls == null)
            throw new ArgumentNullException ("urls");
        if (completionHandler == null)
            throw new ArgumentNullException ("completionHandler");
        BlockLiteral *block_ptr_completionHandler;
        BlockLiteral block_completionHandler;
        block_completionHandler = new BlockLiteral ();
        block_ptr_completionHandler = &block_completionHandler;
        block_completionHandler.SetupBlock (static_InnerNSWorkspaceUrlHandler, completionHandler);

        if (IsDirectBinding) {
            MonoMac.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_IntPtr (this.Handle, selRecycleURLsCompletionHandler_, urls.Handle, (IntPtr) block_ptr_completionHandler);
        } else {
            MonoMac.ObjCRuntime.Messaging.void_objc_msgSendSuper_IntPtr_IntPtr (this.SuperHandle, selRecycleURLsCompletionHandler_, urls.Handle, (IntPtr) block_ptr_completionHandler);
        }
        block_ptr_completionHandler->CleanupBlock ();

    }

    [Export ("duplicateURLs:completionHandler:")]
    public unsafe virtual void DuplicateUrls (NSArray urls, NSWorkspaceUrlHandler completionHandler)
    {
        if (urls == null)
            throw new ArgumentNullException ("urls");
        if (completionHandler == null)
            throw new ArgumentNullException ("completionHandler");
        BlockLiteral *block_ptr_completionHandler;
        BlockLiteral block_completionHandler;
        block_completionHandler = new BlockLiteral ();
        block_ptr_completionHandler = &block_completionHandler;
        block_completionHandler.SetupBlock (static_InnerNSWorkspaceUrlHandler, completionHandler);

        if (IsDirectBinding) {
            MonoMac.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_IntPtr (this.Handle, selDuplicateURLsCompletionHandler_, urls.Handle, (IntPtr) block_ptr_completionHandler);
        } else {
            MonoMac.ObjCRuntime.Messaging.void_objc_msgSendSuper_IntPtr_IntPtr (this.SuperHandle, selDuplicateURLsCompletionHandler_, urls.Handle, (IntPtr) block_ptr_completionHandler);
        }
        block_ptr_completionHandler->CleanupBlock ();

    }

快速测试:

代码语言:javascript
复制
    void TestUrls ()
    {
        var path = Path.GetTempFileName ();
        Console.WriteLine ("TEST: {0} {1}", path, File.Exists (path));

        var array = new NSMutableArray ();
        var url = new NSUrl ("file://" + path);
        array.Add (url);

        var workspace = NSWorkspace.SharedWorkspace;
        workspace.DuplicateUrls (array, (urls, error) => {
            Console.WriteLine ("DUPLICATED: {0} {1}", urls, error);
            array.Add (urls.Values [0]);

            workspace.RecycleUrls (array, (urls2, error2) => {
                Console.WriteLine ("RECYCLED: {0} {1} {2}",
                                   urls2, error2, File.Exists (path));
            });
        });
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13453957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档