Objective c 调度\u异步冲突
目前我正在开发一个聊天应用程序,我正在尝试上传图像,除了图像上传UI冻结外,其他一切都正常,所以异步方法进入了场景,这就是我正在尝试做的:Objective c 调度\u异步冲突,objective-c,ios,Objective C,Ios,目前我正在开发一个聊天应用程序,我正在尝试上传图像,除了图像上传UI冻结外,其他一切都正常,所以异步方法进入了场景,这就是我正在尝试做的: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ [self dismissModalViewControllerAnimated:YES]; disp
- (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锁
或者网络线程。这可能是由于从
次级线程。现在崩溃了
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中显示空缩略图。当您要更改UI中的任何内容时,应在主线程上执行
因此,如果要更改现有HPGrowingTextView
控件的文本,可以执行以下操作:
dispatch_async(dispatch_get_main_queue(), ^{
growingTextView.text = @"Some text";
})
由于在主线程外调用send,所以出现崩溃。堆栈跟踪很明显 您需要在主线程上进行这些调用。但是,当您这样做时,您的UI当然会因为此调用而挂起
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
从方法名来看,很明显,这个调用是同步的,并且将阻塞,直到返回结果
因此,您需要改用异步表单
sendAsynchronousRequest:queue:completionHandler:
[自我发送:imgData];是吗?谢谢你的回复,这是一种图像上传方法。你100%确定是从主线程以外的线程调用UI,如果文件上传了,可能会弹出一个警报视图。好吗?这很糟糕,你应该在主线程上执行类似的东西。你能发布一些代码吗?我想你可能正在处理一个inte某些类型的rface元素,或执行某些接口处理的类。image正在上载到web上…无法发布所有代码,请检查我的帖子我正在编辑它。但我没有更改growingTextView文本。可能您没有显式更改它,但方法
[HPGrowingTextView setText:]
肯定是在方法[chatViewController send:
中的某个地方调用的。很抱歉,我忘记了,实际上我正在更改文本增长文本视图。text=@“这是为了清除它,但现在在图像上载过程中,当我尝试在其中键入内容时,它再次崩溃,键入内容必须与主线程或第二线程有关?现在我在键入或更改文本时没有遇到错误,但当图像上载,然后我尝试发送文本消息时,我得到了这个-[UIButton bytes]:无法识别的选择器发送到实例0x863d8d0 2012-08-15 00:37:33.080 sendapp[763:15b03]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[UIButton bytes]:无法识别的选择器发送到实例0x863d8d0'