目前我正在开发一个聊天应用程序,我正在尝试上传图片,每件事情都运行正常,只是当图片上传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的结果 次要线程。现在崩溃......
- WebThreadLock
- - [UITextView setText:]
- - [HPTextViewInternal setText:]
- - [HPGrowingTextView setText:]
- - [chatViewController发送:]
- __ 74- [chatViewController imagePickerController:didFinishPickingMediaWithInfo:] _ block_invoke_0
- _dispatch_call_block_and_release
- _dispatch_worker_thread2
- _pthread_wqthread
- start_wqthread
醇>
我正在使用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。
答案 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: