Question

I have a ViewController that slides up. When you click "Save" it sends a request to the server. When the request is done, it dismisses the ViewController. I switched the NSURLConnection over to using async and blocks (https://github.com/rickerbh/NSURLConnection-Blocks). Dismissing the ViewController now throws "Thread 2: Program received signal: EXC_BAD_ACCESS". I'm using ARC, if that matters.

- (IBAction) savePressed
{
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://api.com/items/create"]];

    //NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [NSURLConnection asyncRequest:request success:^(NSData *data, NSURLResponse *response) {
        [self close];
    } failure:^(NSData *data, NSError *error) {
        [self close];
    }];
}

- (void) close
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

Here is the log

2012-10-24 10:32:43.780 Prayrbox[22268:1703] bool _WebTryThreadLock(bool), 0x1f21fd90: 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...
1   0x347dc927 WebThreadLock
2   0x36718615 <redacted>
3   0x366d0a85 <redacted>
4   0x3678d789 <redacted>
5   0x366c0637 <redacted>
6   0x366d50e7 <redacted>
7   0x368c1f11 <redacted>
8   0x366d4969 <redacted>
9   0x36744745 <redacted>
10  0x366907ad <redacted>
11  0x7ef71 -[ComposeViewController close]
12  0x7eec5 __36-[ComposeViewController savePressed]_block_invoke_0
13  0x82d8f __56+[NSURLConnection(Blocks) asyncRequest:success:failure:]_block_invoke_0
14  0x37e8811f <redacted>
15  0x37e96259 <redacted>
16  0x37e963b9 <redacted>
17  0x37b30a11 <redacted>
18  0x37b308a4 start_wqthread
[Switching to process 10755 thread 0x2a03]
[Switching to process 10755 thread 0x2a03]
[unknown](gdb) 

I have spent 2 hours searching for help on this. If anyone knows what could help, please speak up! :)

Was it helpful?

Solution

At first thought, I would agree with the above comment that you might be on the wrong thread when dismissing the view.

UI Stuff should be done on Main, so to enforce that, you can do:

-(void) close {
    if([NSThread isMainThread]) {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    else {
        [self performSelectorOnMainThread:@selector(close)
                               withObject:nil
                           waitUntilDone:YES];
    }
}

Rather than doing the performSelectorOnMainThread from your block, this will ensure that anytime it's called you'll be on main.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top