简体   繁体   中英

Tried to obtain the web lock from a thread other than the main thread or the web thread. Crashing now

bool _WebTryThreadLock(bool), 0x8053ce0: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...

I'm getting this error.

Today I've discovered this error for the first time, the password dialog is shown and the alertview is showing on top, which shouldn't occur till viewWillAppear when the view is shown. This all seemed to work fine when I developed this the other day. Not sure why the thread lock has been lost and how and were to implement it?

This may be a result of calling to UIKit from a secondary thread. Crashing now...

...and as far as I can see that's just what you're doing. You're calling [alertProgress dismissWithClickedButtonIndex:0 animated:YES]; , a UIKit method, from a thread other than your main thread(s), which is not allowed.

For a very straight forward way to call back to the main thread if you can't use GCD, take a look at DDFoundation .

Your code would in that case only change to do;

[[alertProgress dd_invokeOnMainThread] dismissWithClickedButtonIndex:0 
                                       animated:YES]; 

I too faced this issue while i was calling a method by

[self performSelector:@selector(myMethod) withObject:nil afterDelay:.01];

Now it has solved by performing it on main thread

[self performSelectorOnMainThread:@selector(myMethod) withObject:nil waitUntilDone:NO];

if you are going to do any UI operation it has to be done on main thread..

simply paste the coding inside the following syntax

dispatch_sync(dispatch_get_main_queue(), ^{

//Your code goes here

});

or you can call your method using the following syntax

[self performSelectorOnMainThread:@selector(yourmethod:)withObject:obj waitUntilDone:YES]

Hope this helps

//最简单的方法是使用主线程调用该函数。

dispatch_async(dispatch_get_main_queue(), ^{ [self doSomething]; });

Durai answer in Swift 3:

DispatchQueue.main.async {
  //Your code goes here
}

I had a similar issue and used

performSelectorOnMainThread:withObject:waitUntilDone:

to solve it. Hope that helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM