iOS的WebThread

当用到UIWebView、UITextField、UITextView等类时,就会看到WebThread线程:

在lldb中搜索

(lldb) image lookup -r -s [wW]ebThread

会有超过一百个结果。

对于普通开发者而言,WebThread最有意义的东西恐怕是UIWebView的私有API

- (void)_setDrawInWebThread:(BOOL)drawInWebThread;

设置YES后,会在WebThread进行渲染的某些操作(layoutTiles),不占用主线程。

Mac上的Safari是多进程程序,排版和渲染等是在独立的进程里。iOS不允许多进程,只有多线程,所以在iOS版的WebCore.framework里会有一些代码来把多进程机制适配成多线程机制,WebThread就是主要产物之一。

iOS的WebCore开源码,6.1版本的下载地址为:http://opensource.apple.com/release/ios-61/

比起webkit.org上的Mac开源码,会多了个wak目录,内有21个文件,其中与WebCoreThread相关的有6个。常见的被调用函数有这么一些:

// The lock is automatically freed at the bottom of the runloop. No need to unlock.
// Note that calling this function may hang your UI for several seconds. Don't use
// unless you have to.
void WebThreadLock(void);

// This is a no-op for compatibility only. It will go away. Please don't use.
void WebThreadUnlock(void);

// Please don't use anything below this line unless you know what you are doing. If unsure, ask.
// ---------------------------------------------------------------------------------------------
bool WebThreadIsLocked(void);
bool WebThreadIsLockedOrDisabled(void);

void WebThreadLockPushModal(void);
void WebThreadLockPopModal(void);

void WebThreadEnable(void);
bool WebThreadIsEnabled(void);
bool WebThreadIsCurrent(void);
bool WebThreadNotCurrent(void);

// These are for <rdar://problem/6817341> Many apps crashing calling -[UIFieldEditor text] in secondary thread
// Don't use them to solve any random problems you might have.
void WebThreadLockFromAnyThread();
void WebThreadLockFromAnyThreadNoLog();
void WebThreadUnlockFromAnyThread();

//
// Release an object on the main thread.
//
@interface NSObject(WebCoreThreadAdditions)
- (void)releaseOnMainThread;
@end

// Register a class for deallocation on the WebThread
void WebCoreObjCDeallocOnWebThread(Class cls);
void WebCoreObjCDeallocWithWebThreadLock(Class cls);

// Asynchronous from main thread to web thread.
void WebThreadCallAPI(NSInvocation *invocation); /* DEPRECATED; use WebThreadRun() in WebCoreThreadRun.h */
void WebThreadAdoptAndRelease(id obj);

// Synchronous from web thread to main thread, or main thread to main thread.
void WebThreadCallDelegate(NSInvocation *invocation);
void WebThreadRunOnMainThread(void (^)(void));

// Asynchronous from web thread to main thread, but synchronous when called on the main thread.
void WebThreadCallDelegateAsync(NSInvocation *invocation);

// Asynchronous from web thread to main thread, but synchronous when called on the main thread.
void WebThreadPostNotification(NSString *name, id object, id userInfo);

// Convenience method for making an NSInvocation object
NSInvocation *WebThreadMakeNSInvocation(id target, SEL selector);

UIKit只工作在main thread,WebCore工作在WebThread,当产生交集时就需要线程间通信,以上函数就是为了线程间消息服务的,最多的操作当然就是加锁了。具体的发消息实现有几种,RunLoop、GCD、performSelector、pthread都会用,也可谓复杂了。依我看应该是新老技术替换的结果,说不定还是新老员工的不同工作结果。

WebThread是以pthread创建的,有全局变量pthread_t webThread来做引用,在不少地方会有
pthread_equal(pthread_self(), webThread)
的判断。

模态机制用的是CFRunLoop。异步消息多用GCD。

在WebView和Clients间通信时,有两个类作为消息中转,_WebSafeForwarder和_WebSafeAsyncForwarder。

让人纠结的是,iOS的实现是在把单线程的Mac上的WebKit.framework改成多线程,但又没法用类似WebKit2.framework的那种多进程方案。WebKit.framework里诸多的WebHTMLView是会直接访问WebCore的,所以iOS上的WebKit.framework里多了好多的锁。为了避免被developer吐槽,这个框架就干脆不公开了,用UIWebView封装好,只有那几个简单的接口来做门面。

时间: 2024-11-03 08:23:45

iOS的WebThread的相关文章

iOS WebCore的wak目录

<iOS的WebThread>中提到: iOS的WebCore开源码,6.1版本的下载地址为:http://opensource.apple.com/release/ios-61/ 比起webkit.org上的Mac开源码,会多了个wak目录,内有21个文件. 今天认真看了下全目录,还果然挖掘出好多信息.这21个文件的文件名,8个以WAK开头,6个以WebCoreThread开头,7个以WK开头. 一.WAK* 第一个文件WAKAppKitStubs.h里就有重大新闻,我一直的猜想都是正确的:

iOS WebCore的WebEvent和EventHandler

WebEvent是iOS专有的类,负责封装和携带从UIKit得到的系统事件信息,并由WebKit层的WAKResponder子类传递到WebCore的EventHandler. UIKit层的逻辑可参考<iOS私有API(三) UIWebView下的手势识别器gestureRecognizer>,WebKit层的相关类可参考<WebCore::Widget浅探>. 开源码中WebEvent的声明为: typedef enum { WebEventMouseDown, WebEven

iOS Safari和UIWebView对orientationchange事件的实现

背景知识: Safari Web Content Guide中关于orientationchange的文档: http://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW16 这里用addEventListener来实现:htt

iOS Safari/WebKit对DeviceOrientationEvent的实现

背景知识: Apple官方只发现一个文档: https://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/DeviceOrientationEventClassRef/DeviceOrientationEvent/DeviceOrientationEvent.html 连个例子都没有,还是自己实践吧.https://code.csdn.net/hursing/pagetest/blob

iOS Safari/WebKit对DeviceMotionEvent的实现

请先阅读<iOS Safari/WebKit对DeviceOrientationEvent的实现>,本文是姐妹篇. 简单地描述一下区别,后面会更详细对比: DeviceOrientationEvent是获取方向,得到device静止时的绝对值: DeviceMotionEvent是获取移动速度,得到device移动时相对之前某个时间的差值比. 背景知识: Apple官方依然只发现一个文档: https://developer.apple.com/library/safari/#document

苹果iOS 程序图标的设计技巧

文章像三联的朋友们介绍苹果iOS 程序图标的设计技巧,教程难度中等,IPHONE.IPAD.IPOD成为越来越多的人使用的移动互联设备,因此我们经常会遇到为这些设备设计图片,特别是设计IPHONE图标,这篇文章就像三联的朋友们详细的介绍一下IPHONE图标的设计流程,好了一起来学习吧:程序图标主要作用是为了使该程序更加具象及更容易理解,除了上述的作用外,有更好视觉效果的图标可以提高产品的整体体验和品牌,可引起用户的关注和下载,激发起用户点击的欲望. 表现形态 在有限的空间里表达出相对应的信息,在

iOS 的 XMPPFramework 简介

XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开发. 1. 登录和好友上下线 1.1XMPP中常用对象们 XMPPStream:xmpp基础服务类 XMPPRoster:好友列表类 XMPPRosterCoreDataStorage:好友列表(用户账号)在core data中的操作类 XMPPvCardCoreDataStorage:好友名片(昵

ios-需要在IOS中设置延迟功能

问题描述 需要在IOS中设置延迟功能 需要一个延时器,进行23秒的延迟然后执行函数.应该怎么实现?用不用NSTimer? 解决方案 performSelector: withObject: afterDelay: 解决方案二: 简单点的话,使用performSelector: withObject: afterDelay: 方法 [self performSelector:@selector(delayMethod:) withObject:nil afterDelay:23];

iOS版微软自拍App上架:自然美颜 上手简单

如今智能手机拍摄功能越来越强大,凭借着更高像素以及移动互联网社交分享的便利性,手机已然取代传统数码相机成为了爱拍一族必不可少的随身利器.然而爱美之心人皆有之,仅依靠自带相机的拍摄效果慢慢无法满足用户的高标准,对此市面上开始集中涌现各式各样的美颜自拍应用. 考虑到自拍应用如此高的受众,微软显然也想来分一杯羹.本周由微软亚太研发集团推出的照片优化应用<微软自拍>正式上线iOS应用商店.相比其他照片处理软件,微软自拍拥有更简单的操作界面,而处理方式也更为自然. 微软自拍可以根据用户的年龄.性别.肤色