JavaScriptCore和UIWebView一起使用的時(shí)候洒扎,調(diào)用js的Alert()方法辑甜,造成UI界面停止響應(yīng)


2016年12月03日星期六


  • 今天在使用JavaScriptCore和UIWebView交互使用的時(shí)候,出現(xiàn)了非常奇怪的問題逊笆。
    問題如下面所敘:
    • 我在JS->OC->JS的最后一步:OC->JS的時(shí)候栈戳,出現(xiàn)了問題。之前我沒有調(diào)用alert()方法难裆,用js作個(gè)彈出框來顯示JS傳給OC后子檀,OC操作后的數(shù)據(jù)通過,OC->JS來完成在js中以彈出框來顯示乃戈。
      代碼順序如下:
  • js

function showSelect(){
                    var selectParams = {
                        title : "提示標(biāo)題",//提示標(biāo)題
                        list : new Array("選項(xiàng)一","選項(xiàng)二","6666","哈哈哈"),//選擇列表
                        buttonA : "確定",
                        buttonB : "取消",
                        buttonOnclick : function(data){
                            //列表選擇結(jié)果
                            alert(data);
                            document.getElementById("result").innerText = data;
                        }};
                    ddd.webview.showListSelect(selectParams);
  • OC


dispatch_async(dispatch_get_main_queue(), ^{
    JSValue *yx =  self.jsContext[@"ddd"];
    JSValue *webview = yx[@"webview"];
    JSValue *commonButtonOnClickLinstener = webview[@"commonButtonOnClickListener"];
    [commonButtonOnClickLinstener[@"buttonOnclick"] callWithArguments:@[@"ddd"]];
    });


  • 在OC中回調(diào)的時(shí)候褂痰,沒有在主線程操作的話,整個(gè)UI界面會停留在症虑,JS彈出框出來之前的界面缩歪,界面平靜的沒有一絲波紋。

  • 在使用了主線程之后谍憔,UI界面就跟一個(gè)癩蛤蟆一樣匪蝙,你碰一下就動(dòng)一下。UI界面停止在JS彈出框出來的界面(喲呵)习贫。

  • 查看了一下逛球,百度,呵呵噠苫昌,除了簡單的介紹如何讓你javascriptcore入門颤绕,講解的稍微深點(diǎn)的,都是非常少祟身。

  • 在stack overflow上找了半天 終于尋到了一絲頭緒奥务。是線程的問題,不知道是阻塞了主線程還是子線程被阻塞了袜硫,反正在你回調(diào)js的那一刻氯葬,就是有問題。具體是什么問題父款,我也不好揣測溢谤,畢竟才疏學(xué)淺瞻凤。

  • 但是經(jīng)過檢測,把解決方案試了出來世杀。

-(void)DelegateFunc:(NSString *)str{//某個(gè)代理回調(diào)函數(shù)(模擬一下)
 [self performSelectorOnMainThread:@selector(ddd) withObject:nil waitUntilDone:NO];
}

-(void)ddd{
    JSValue *yx =  self.jsContext[@"ddd"];
    JSValue *webview = yx[@"webview"];
    JSValue *commonButtonOnClickLinstener = webview[@"commonButtonOnClickListener"];
    [commonButtonOnClickLinstener[@"buttonOnclick"] callWithArguments:@[@"ddd"]];
}
  • 這樣執(zhí)行下來就算是讓他們繼續(xù)工作了阀参。
    當(dāng)然這里貼一下 [self performSelectorOnMainThread:@selector(ddd) withObject:nil waitUntilDone:NO] 中waitUntilDone參數(shù)設(shè)定的功效:
    • YES: 等ddd()方法執(zhí)行完成后,子線程才會繼續(xù)執(zhí)行后面的代碼瞻坝。
    • NO: 不用等待等待ddd()方法執(zhí)行完成后蛛壳,直接執(zhí)行后面的代碼。
      (2017-4-13日補(bǔ)充:這個(gè)的意思是把任務(wù)放在主線程上執(zhí)行所刀。錯(cuò)啦?)

2018-3-06日補(bǔ)充:回到webView的線程去調(diào)用

(callWithArguments就不會崩潰(因?yàn)閖s和oc綁定的函數(shù)衙荐,在函數(shù)里執(zhí)行的代碼不是在主線程里執(zhí)行的)。
模擬代碼:

///假設(shè)這個(gè)函數(shù)是和js的test函數(shù)綁定的浮创。如果監(jiān)聽到這個(gè)函數(shù)就進(jìn)行網(wǎng)絡(luò)請求或者上傳圖片等操作忧吟。

- (void)test {
  //獲取webView線程,因?yàn)閖s和oc綁定的函數(shù)里執(zhí)行的代碼不是在主線程里斩披。
NSThread *webThread = [NSThread currentThread];
//網(wǎng)絡(luò)請求
@weakify(self);
[HTTPRequest requestGetTokenWithFinished:^(void){
  @strongify(self);

  //通知js請求完了溜族。

 //正常情況下是直接在這里調(diào)用,但是會間接性發(fā)生野指針問題垦沉,差不多每隔四五次發(fā)生一次野指針煌抒。
  //JSValue *jsCall = self.context[@"jsCall"];
  //[jsCall callWithArguments:nil];

  //線程安全的,用此方式厕倍,筆者再也沒發(fā)生過野指針問題寡壮。
  [self performSelector:@selector(jsCall) onThread:webThread withObject:nil waitUntilDone:NO];
}];
}

- (void)jsCall {
  JSValue *jsCall = self.context[@"jsCall"];
  [jsCall callWithArguments:nil];
})

具體的解釋:遇到這個(gè)問題的人,肯定能明白讹弯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末况既,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子组民,更是在濱河造成了極大的恐慌坏挠,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邪乍,死亡現(xiàn)場離奇詭異,居然都是意外死亡对竣,警方通過查閱死者的電腦和手機(jī)庇楞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來否纬,“玉大人吕晌,你說我怎么就攤上這事×偃迹” “怎么了睛驳?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵烙心,是天一觀的道長。 經(jīng)常有香客問我乏沸,道長淫茵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任蹬跃,我火速辦了婚禮匙瘪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝶缀。我一直安慰自己丹喻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布翁都。 她就那樣靜靜地躺著碍论,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柄慰。 梳的紋絲不亂的頭發(fā)上鳍悠,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音先煎,去河邊找鬼贼涩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛薯蝎,可吹牛的內(nèi)容都是我干的遥倦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼占锯,長吁一口氣:“原來是場噩夢啊……” “哼袒哥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起消略,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤堡称,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后艺演,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體却紧,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年胎撤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晓殊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伤提,死狀恐怖巫俺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肿男,我是刑警寧澤介汹,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布却嗡,位于F島的核電站,受9級特大地震影響嘹承,放射性物質(zhì)發(fā)生泄漏窗价。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一赶撰、第九天 我趴在偏房一處隱蔽的房頂上張望舌镶。 院中可真熱鬧,春花似錦豪娜、人聲如沸餐胀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽否灾。三九已至,卻和暖如春鸣奔,著一層夾襖步出監(jiān)牢的瞬間墨技,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工挎狸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扣汪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓锨匆,卻偏偏與公主長得像崭别,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子恐锣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫茅主、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,280評論 25 707
  • 如何編譯FFmpeg 并且引入Android Studio 如何在Android 中使用FFmpeg命令 土榴? Gi...
    maimingliang閱讀 4,022評論 10 10
  • 看看咯
    a7967ecb6b14閱讀 109評論 0 0
  • 這一段時(shí)間公司項(xiàng)目要做一下重構(gòu)诀姚,將相關(guān)功能模塊兒都單獨(dú)分離出來,我這邊負(fù)責(zé)把播放器的部分進(jìn)行分離玷禽。公司這邊是用的一...
    aaasun閱讀 626評論 0 0