给Xcode安装插件并不一定需要重启

通常我们都是借助Alcatraz来给Xcode安装插件的,看到的教程都是要告诉我们安装插件完之后需要重启Xcode,然后插件才会生效。今天发现其实并不一定。

发现这个多亏今天提的一个PR。起因是这样的,前几天给Xcode安装了Injection Plugin for Xcode插件,没想到每次启动Xcode时都会提示"InInjectionPlugin: Could not locate Product Menu"。今天抽空看了一下它的源码,发现它的初始化就是简单的在pluginDidLoad:方法中进行异步调用,这会导致一个问题,在慢速电脑上Xcode不一定完全加载完成了,比如Product菜单还没有加载显示出来——我的Mac Mini刚好就这样中奖了。

在我看来,正确的办法应该是在pluginDidLoad:方法里增加NSApplicationDidFinishLaunchingNotification通知的观察,收到通知了才进行触发。于是我就提了这样一个PR:

屏幕快照 2016-03-31 下午3.14.41.png

结果下午午睡完就收到了大神的回复:"This is the way it used to work. Let me have a look at another solution. using the Async call has the advantage that people don’t need to restart Xcode when they install the plugin." 然后他自己做了一个修改,如下所示:

屏幕快照 2016-03-31 下午3.20.23.png

看这个修改就会发现是很多人都会用到的简单小伎俩,通过延时调用自己来确保需要的条件满足。

接着我用Alcatraz安装Injection Plugin测试,果不其然,不需要重启Xcode就能看到插件安装上了。虽然是简单的几行代码,却又进一步提升大家使用Xcode的效率了。

说到这里有人估计还是不明白,为什么它不用重启Xcode就生效了呢?其实答案已经很明显了,我提供的观察NSApplicationDidFinishLaunchingNotification通知方法只在Xcode启动时才有,所以只能重启生效。而大神的方法在任何时机调用pluginDidLoad:就能生效,并且关键的关键是:安装完插件后,Alcatraz会主动调用插件的pluginDidLoad:方法——这也是我在最后翻Alcatraz的源码才确认的。

看看,与大神交流就是有收获,有时间的话大家还是多多发PR吧。

你可能感兴趣的:(给Xcode安装插件并不一定需要重启)