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.

  • What is most common and correct practice to get a CGFloat from an NSNumber?
  • How to change or update NSLayoutConstraint programmatically
  • iOS Swift: Get user selected phone number from CNContactProperty as a string
  • How to unzip a .zip file on iOS?
  • IOS - Can't open Whatsapp chat programatically, but can do it through HTML
  • iOS Use Vary For Traits Between iPhone Sizes
  • 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?

    6 Solutions Collect From Internet About “Tried to obtain the web lock from a thread other than the main thread or the web thread. Crashing now”

    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

    //The easiest way is to call the function using main thread for that.


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

    I had a similar issue and used

    performSelectorOnMainThread:withObject:waitUntilDone:
    

    to solve it. Hope that helps.

    Durai answer in Swift 3:

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