Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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
Ios 在触发return之前,等待完成的异步部分_Ios_Xcode_Asynchronous_Grand Central Dispatch - Fatal编程技术网

Ios 在触发return之前,等待完成的异步部分

Ios 在触发return之前,等待完成的异步部分,ios,xcode,asynchronous,grand-central-dispatch,Ios,Xcode,Asynchronous,Grand Central Dispatch,我在试图阻止我的连接方法在整个连接部分完成之前退出时遇到问题 在连接过程中,我将显示一个进度微调器 如何确定只有在整个连接块完成后才调用return ret 我在这里所示的条件下尝试过,但没有成功 她是我代码的一部分: MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:vC.view animated:YES]; hud.labelText = [NSString stringWithFormat: NSLocalizedString(@"lo

我在试图阻止我的连接方法在整个连接部分完成之前退出时遇到问题

在连接过程中,我将显示一个进度微调器

如何确定只有在整个连接块完成后才调用return ret

我在这里所示的条件下尝试过,但没有成功

她是我代码的一部分:

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:vC.view animated:YES];
hud.labelText = [NSString stringWithFormat: NSLocalizedString(@"login_to_server", @"")];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {

    //Try to connect

    // If OK
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [MBProgressHUD hideHUDForView:vC.view animated:YES];            
    });

    // If NOK
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [alert show]; // Showing UIAlertView with error message
    });       
});
return ret;}

你不能。为了解决您的问题,您通常有一个完成块,在异步作业完成后将调用该块

调用异步方法可以如下所示:

[_activityIndicatorView startAnimating];
[self doSomeAsynchronousWork:^(BOOL success) {
    [_activityIndicatorView stopAnimating];
}];
- (void)doSomeAsynchronousWork:(void (^)(BOOL success))completionBlock {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // do some work and call the completion block once finished
        dispatch_async(dispatch_get_main_queue(), ^{
            completionBlock(YES);
        });
    });
}
其中doSomeAsynchronousWork:将如下所示:

[_activityIndicatorView startAnimating];
[self doSomeAsynchronousWork:^(BOOL success) {
    [_activityIndicatorView stopAnimating];
}];
- (void)doSomeAsynchronousWork:(void (^)(BOOL success))completionBlock {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // do some work and call the completion block once finished
        dispatch_async(dispatch_get_main_queue(), ^{
            completionBlock(YES);
        });
    });
}

好的,如果这是唯一的方法,我需要重新编写代码,因为我在另一个方法中等待返回值。是的,你可以通过委托来完成,但是block/gcd模式是苹果在几乎所有新api中使用的模式,所以使用它是一种很好的做法。那么为什么你不能编写呢?因为你不能从主线程调用一个方法并等待它返回一些值而不阻塞主线程。我猜您使用dispatch\u async时需要非阻塞IO。如果您真的只想让您的方法完成网络内容,然后返回,那么您应该去掉所有这些dispatch\u async。然而,这将导致可怕的用户界面体验…我在主线程上显示一个微调器,并在后台尝试连接到服务器。所以需要dispatch_async,我看不出哪里会有糟糕的UI体验。。。通过微调器和UIAlertView通知用户正在进行通信。。。