Iphone 使用performSelectorOnMainThread调用非void函数
正如我问题的标题所说。。我试图用Iphone 使用performSelectorOnMainThread调用非void函数,iphone,objective-c,ios,multithreading,Iphone,Objective C,Ios,Multithreading,正如我问题的标题所说。。我试图用performselectornmainthread调用一个非void函数。。我的函数返回UIImage,当我这样调用它时: UImage *img = [self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES]; 它给了我一个错误,我有不兼容的赋值类型,我也尝试这样强制转换它 UImage *img = (UIImage*)[
performselectornmainthread
调用一个非void函数。。我的函数返回UIImage
,当我这样调用它时:
UImage *img = [self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES];
它给了我一个错误,我有不兼容的赋值类型,我也尝试这样强制转换它
UImage *img = (UIImage*)[self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES];
我遇到了语义问题:“void”类型的操作数,其中需要算术或指针类型
我知道我可以正常调用它,但我正在尝试一些多线程的东西,需要它像这样调用。。那么我怎样才能防止这个错误呢
编辑:
我尝试在这个函数(captureScreen)中使用GCD,它会在“viewToCapture”中不断使Exc\u访问变差。。所以我决定在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(), ^{
});
});
“捕获屏幕延迟:”如下所示
- (void) captureScreenDelayed:(EpubPageViewController*)pageView
{
if(!pageView)
pageView = [self currentPageView];
if(pageView.pageImageView)
pageView.pageImageView.image = (UIImage*)[self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES];
}
和捕获屏幕:
老实说,我不确定这是否是正确的方法,以获得在分离线程的图像。。。非常感谢您的建议。这里您必须记住的是,您实际调用的方法是
-performselectornmainthread:withObject:waitUntilDone:
,它具有(void)
返回类型。因此,您无法获得通过此方法返回的已执行选择器的结果。如果需要执行这种类型的多线程处理,应检查,尤其是。performselectornmainthread:…
没有返回值。您需要找到其他一些机制来恢复图像。在本例中,一种简单的方法是将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];
}
我正在使用GCD。。要理解我的问题,请检查我的编辑。我不想说,但你在这里做的事情实际上相当危险。根据文档,
UIKit
对象实际上只能在主线程上访问(尤其是UIResponder
对象,其中UIImageView
是一个子类)。所以如果你站在我这边。。你会怎么做?由于捕获图像是在另一个线程中执行所必需的,否则我的应用程序UI中会出现一个危险的问题:)那么,你想实现什么?简单地在主线程上捕获图像并完全避免多线程处理,您会遇到什么问题?底线是:您不能。必须在主线程上调用对UI的更改。@Malek_Jundi:如果使用GCD,这并不重要。基本上-性能选择器:
没有返回值。你必须使用不同的方法来恢复图像。是的,我明白这一点,但我现在陷入了另一个问题。你可以检查编辑和评论,并给出一些建议,我该如何做。谢谢。我试过你的解决办法,但它不起作用。。EXC_错误的指令!
-(void) captureScreen: (NSMutableArray*) parameterArray
{
UIView* webView = [parameterArray objectAtIndex: 0];
// capture the screen
[parameterArray addObject: capturedImage];
}