转:http://tangqiaoboy.blog.163.com/blog/static/1161142582011873458953/
主道路,人行道,不要占用资源,
在单机的多线程程序里,为了保证UI的操作线程安全,都会要求UI的操作在一个特定的线程里面进行,通常情况下,这个特定线程指的是程序的主线程。所以,当你的代码在主线程运行的时候,实际上会造成UI不能重绘,应该尽量把长时间的操作放到非主线程中去。
对于在iphone里的app也一样应该遵守上面这个原则。不过iphone的 UIWebView的stringByEvaluatingJavaScriptFromString只能在主线程里面被调用,如果恰好这个js执行时间比较长,就会造成程序卡死。iphone版的有道笔记的编辑功能就是用内嵌UIWebView + js来实现的,这样的话,如果笔记内容非常复杂,在保存的时候,有可能js会执行1-2秒钟,造成程序有1-2秒的假死状态。
一种可能的改进方法是,将js改成异步调用的,即stringByEvaluatingJavaScriptFromString调用的js函数,js函数里用 setTimeout 设置一个异步的调用方法,然后立即返回。这样主线程就不会被阻塞。不过这样的坏处就是,因为js执行异步了,stringByEvaluatingJavaScriptFromString无法取得js函数执行的真实返回值。
为了改进上面的方法,只有再增加一个js的异步回调,让js异步调用完成后,通知UIWebView。但是这样又会带来一个问题,如果有多个js异步操作,那么还需要在UIWebView记录下每个异步操作的id及其操作的相关数据,以便于区分多个回调的类型。
于是,一个复杂的异步回调模型就这样搞出来了。但其实我想说,去他妈的,js执行时间长的情况非常非常少,还是不管了算了。
闭包是一个函数(或指向函数的指针),再加上该函数执行的外部的上下文变量(有时候也称作自由变量)。原来就是一个引用,对函数的引用,