用performSelectorOnMainThread调用非void函数

作为我的问题的标题说..我尝试调用一个非void函数performSelectorOnMainThread ..我的函数返回UIImage ,当我这样调用它:

 UImage *img = [self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES]; 

它给了我一个错误,我有不兼容的分配types,我也尝试像这样施放它

 UImage *img = (UIImage*)[self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES]; 

我得到了语义问题:需要算术或指针types的types为“void”的操作数

我知道我可以把它作为正常的,但我尝试一些multithreading的东西,需要它像这样调用。所以我怎么能防止这个错误,请?

编辑:

我尝试在这个函数(captureScreen)中使用GCD,并且在“viewToCapture”上继续使用Exc_bad_access ..所以我决定调用GCD块内的父函数

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(queue, ^{ [self captureScreenDelayed:pageView]; dispatch_sync(dispatch_get_main_queue(), ^{ }); }); 

和“ captureScreenDelayed :”如下

 - (void) captureScreenDelayed:(EpubPageViewController*)pageView { if(!pageView) pageView = [self currentPageView]; if(pageView.pageImageView) pageView.pageImageView.image = (UIImage*)[self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES]; } 

CaptureScreen

 -(UIImage*)captureScreen:(UIView*) viewToCapture { UIGraphicsBeginImageContextWithOptions(viewToCapture.bounds.size, viewToCapture.opaque, 0.0); [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return viewImage; } 

说实话林不知道如果这是正确的方式来分离线程中的图像…我欣赏任何意见。

这里你必须记住的是你实际调用的方法是-performSelectorOnMainThread:withObject:waitUntilDone:它有一个(void)返回types。 因此,你不能得到通过这个方法返回的执行select器的结果。 如果你需要做这种types的multithreading,你应该查看并发编程指南 ,尤其是大中央调度 。

performSelectorOnMainThread:...没有返回值。 你需要find一些其他机制来恢复图像。 一个简单的方法,这将在这种情况下工作,因为您正在等待select器完成,将传递一个NSMutableArray作为您的对象,并添加到主线程中的图像

 NSMutableArray* parameterArray = [[NSMutableArray alloc] init]; [parameterArray addObject: webView]; [self performSelectorOnMainThread:@selector(captureScreen:) withObject:parameterArray waitUntilDone:YES]; if ([parameterArray count > 1) { UIImage* img = [webView objectAtIndex: 1]; } else { // error } 

captureScreen:看起来像

 -(void) captureScreen: (NSMutableArray*) parameterArray { UIView* webView = [parameterArray objectAtIndex: 0]; // capture the screen [parameterArray addObject: capturedImage]; }