为什么从NPAPI插件的safari崩溃中调用NSOpenPanel?

时间:2012-12-12 03:37:15

标签: objective-c safari npapi openfiledialog

以下代码崩溃了我的插件:

NSOpenPanel *openFileDig = [NSOpenPanel openPanel];    
[openFileDig setCanChooseFiles:true];      
[openFileDig setCanChooseDirectories:false];     
[openFileDig setAllowsMultipleSelection:false];     
[openFileDig setDirectory:NSHomeDirectory()];     
if ([openFileDig runModal] == NSOKButton)   
{       
    .........     
}

在没有做任何事情的情况下,在大约3分钟内,当openFileDig正在运行时,插件将会消失。有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:2)

你在NPAPI调用中阻塞主线程 - 这几乎是NPAPI no-no#1。

永远永远在NPAPI呼叫期间阻止主线程。如果你需要做一些需要一段时间并需要回电的事情,你应该异步进行,然后将回调发回javascript。 (传递给你的npapi函数的js函数将是一个NPObject,你可以调用NPN_InvokeDefault来调用)

由于你的runModal需要在主线程上运行,你需要使用类似performSelectorOnMainThread来调用一个函数来调用它,然后在完成后调用你的js回调。还要记住,所有NPAPI调用都必须在主线程上进行,你应该很好。

您的插件会阻塞,因此浏览器长时间没有从插件中回复后会假设它崩溃并导致其崩溃。