dispatch_async冲突

时间:2012-08-14 18:56:02

标签: objective-c ios

目前我正在开发一个聊天应用程序,我正在尝试上传图片,每件事情都运行正常,只是当图片上传UI冻结时,所以async方法进入了场景,这就是我想要的做:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

    [self dismissModalViewControllerAnimated:YES];
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
        dispatch_async(queue, ^{

        UIImage *image = [info objectForKey: UIImagePickerControllerOriginalImage]; 
        NSData *imgData = UIImageJPEGRepresentation(image, 1.0);

        //[self performSelectorOnMainThread:@selector(send:) withObject:imgData waitUntilDone:YES];

        [self send:imgData];
});

}

我收到此错误:

  

尝试从主线程以外的线程获取Web锁定   或网络线程。这可能是从一个调用UIKit的结果   次要线程。现在崩溃......

     
      
  1. WebThreadLock
  2.   
  3. - [UITextView setText:]
  4.   
  5. - [HPTextViewInternal setText:]
  6.   
  7. - [HPGrowingTextView setText:]
  8.   
  9. - [chatViewController发送:]
  10.   
  11. __ 74- [chatViewController imagePickerController:didFinishPickingMediaWithInfo:] _ block_invoke_0
  12.   
  13. _dispatch_call_block_and_release
  14.   
  15. _dispatch_worker_thread2
  16.   
  17. _pthread_wqthread
  18.   
  19. start_wqthread
  20.   

我正在使用HPGrowingTextView为输入消息提供iMessage类型的可扩展输入区域,但是遇到了这个问题。

我搜索了这个错误

  

尝试从主线程以外的线程获取Web锁定   或网络线程。这可能是从一个调用UIKit的结果   辅助线程

人们建议使用performSelectorOnMainThread,但这种方法会再次冻结用户界面。

如何解决这种冲突或是否有其他方法。

Inside [self send:imageData]
...building a url and appending hFile(imageData)
[body appendData:[NSData dataWithData:hFile]];
            [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
            // setting the body of the post to the reqeust
            [request setHTTPBody:body];

            NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
            NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

            NSString *imgUrl = [NSString stringWithFormat:@"http://www.www.www/uImages/thumbs/%@",returnString];
...

上传后,会返回图片的缩略图,如果我使用[NSURLConnection sendAsynchronousRequest,我会得到空的缩略图,我正在浏览uitableview。

2 个答案:

答案 0 :(得分:1)

当您想要更改UI中的任何内容时,您应该在主线程上执行此操作。

因此,如果您想更改HPGrowingTextView控件的文字,可以执行以下操作:

dispatch_async(dispatch_get_main_queue(), ^{
    growingTextView.text = @"Some text";
})

答案 1 :(得分:0)

您正在收到崩溃,因为您正在主线程之外调用send。关于这个事实,堆栈跟踪是显而易见的。

您需要在主线程上进行这些调用。但是,当你这样做时,你的UI当然会因为这个电话而挂起......

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

从方法名称来看,很明显这个调用是同步的,并且会一直阻塞,直到返回结果。

因此,您需要使用异步表单。

sendAsynchronousRequest:queue:completionHandler: