Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用performSelectorOnMainThread调用非void函数_Iphone_Objective C_Ios_Multithreading - Fatal编程技术网

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];
}