2012-11-19 32 views
1

根据the MonoMac documentationNSWorkspace.RecycleUrls签名是:的MonoMac NSWorkspace.RecycleUrls与recycleURLs:completionHandler

[MonoMac.Foundation.Export("recycleURLs:completionHandler:")] 
public virtual void RecycleUrls (MonoMac.Foundation.NSDictionary urls, NSWorkspaceUrlHandler completionHandler) 

根据Apple's documentation for NSWorkspacerecycleURLs:completionHandler为签名是:

- (void)recycleURLs:(NSArray *)URLs completionHandler:(void (^)(NSDictionary *newURLs, NSError *error))handler 

我有网址的阵列我想要回收。

在这里我很难倒 - Apple的文档说第一个参数是NSArray,但是MonoMac想要一个NSDictionary。所有构建NSDictionary的函数都需要键值值(不出所料),而我只有

除了采用MonoMac的RecycleUrls(转载如下)并将其改写为NSArray之外,还有什么要做吗?

[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(); 
} 
+0

感谢您报告此:-) –

回答

2

Mono的结合是不正确的,我都修改了NSWorkspace.RecycleUrls()NSWorkspace.DuplicateUrls()采取的NSArray,而不是NSDictionarymonomac commit b1eda57

这是生成的代码:

[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(); 

    } 

快速测试:

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

感谢您的调查。 –

+0

我相信'RecycleUrls'是异步的,在完成块之前调用'CleanupBlock'的目的是什么?我可以看到这个实现调用某种资源释放('GCHandle.FromIntPtr(...)。Free();'),但是我希望在函数完成之后释放资源*。 –

+0

哦,好点!甚至没有看过那段自动生成的代码。看起来我们可能不得不在发生器中对此做些什么,我会看看。 –