目标C-如何等待异步调用完成

威姆·里德(Wim De Ridder)

我是iOS开发新手。我已经搜索并尝试了几种方法,但是该程序不想等待异步调用完成。

调试时,函数CheckForHost首先返回-1作为retVal。这将导致调用该函数的方法继续。一秒钟后,程序返回到CheckForHost函数,将正确的值设置为retVal。我也尝试过NSCondition但也没有运气...

有人可以告诉我我做错了还是应该做不同的事情?非常感谢您的帮助!

下面的代码:

-(int)CheckForHost
{
    InternetActive = -1;
    HostActive = -1;
   dispatch_queue_t myQueue = dispatch_queue_create("my queue", NULL);
    __block int retVal = -1;
    dispatch_async(myQueue, ^{
        [self HostInit];
        dispatch_async(dispatch_get_main_queue(), ^{
            [internetReachable stopNotifier];
            [hostReachable stopNotifier];
            [[NSNotificationCenter defaultCenter] removeObserver:self];
            if (InternetActive == 0) {
                retVal = 0;
            } else if (HostActive == 0) {
                retVal = 1;
            } else
                retVal = 2;
        });
    });
    return retVal;
}

-(void)HostInit
{
    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
    internetReachable = [Reachability reachabilityForInternetConnection];
    [internetReachable startNotifier];
    // check if a pathway to a random host exists
    hostReachable = [Reachability reachabilityWithHostName:@"www.apple.com"];
    [hostReachable startNotifier];
    // now patiently wait for the notification
}

-(void)checkNetworkStatus:(NSNotification *)notice
{
    // called after network status changes
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            InternetActive = 0;
            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");
            InternetActive = 1;
            break;
        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");
            InternetActive = 1;
            break;
        }
    }
    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)
    {
        case NotReachable:
        {
            NSLog(@"A gateway to the host server is down.");
            HostActive = 0;
            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.");
            HostActive = 1;
            break;
        }
        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.");
            HostActive = 1;
            break;
        }
    }
}

吉尔·桑德(Gil Sand)

我会使用积木,它们既简单又可靠

这是带有block的函数的示例:

- (void)checkForHostWithBlock:(void (^)(int myReturnedInt))completion{

 //Our function does stuff here, i'll copy paste some of your code

InternetActive = -1;
    HostActive = -1;
   dispatch_queue_t myQueue = dispatch_queue_create("my queue", NULL);
    __block int retVal = -1;
    dispatch_async(myQueue, ^{
        [self HostInit];
        dispatch_async(dispatch_get_main_queue(), ^{
            [internetReachable stopNotifier];
            [hostReachable stopNotifier];
            [[NSNotificationCenter defaultCenter] removeObserver:self];
            if (InternetActive == 0) {
                retVal = 0;
            } else if (HostActive == 0) {
                retVal = 1;
            } else
                retVal = 2;
            if (completion){
                completion(retVal);
            }
        });
    });
}

妳去

您可以像调用其他任何方法一样调用该方法,并且可以使用自动完成功能来确保正确记录所有内容。

[self checkForHostWithBlock:^(int myReturnInt){
   //Executed code when the block is called in checkForHost:
   NSLog(@"Here is my int : %i  !!", myReturnInt);
}];

请注意,block参数可以为nil,但是您需要确保随后在方法中对其进行检查。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何等待所有异步调用完成

如何异步调用方法并等待API调用完成

等待多个异步调用完成?

提交表单之前,请等待异步调用完成

在React渲染之前等待多个异步调用完成

如何等待大量任意数量的深度嵌套异步jQuery ajax调用完成

你如何等待所有异步调用在Java中完成?

我如何等待异步调度的块完成?

如何等待 API 调用完成然后返回结果?

我如何等待数据库调用完成

异步调用完成后如何访问Set

如何等待来自forEach循环的多个异步调用?

在运行下一个代码之前,如何等待异步JSZip .forEach()调用完成?

在单元测试之前,如何等待异步调用在组件的安装回调中完成?

量角器 - 在执行 expect 之前等待异步调用完成

等待多个异步调用完成后再继续

Javascript - 在从函数返回之前等待异步调用完成,不使用回调

Node.js-等待多个异步调用完成,然后继续执行代码

在运行视图控制器 (Swift) 的“覆盖”功能之前等待异步调用完成

C#如何等待SQL查询完成?

如何等待exec完成在C中的管道写入

如何等待C#中的方法完成?

在目标C中使用完成处理程序调用Swift函数

等待异步函数调用完成

等待多个(异步)API 调用完成

Qt异步调用:如何在异步调用完成其工作后运行某些内容

在ngOnDestroy函数中调用时如何等待api调用完成?

循环中的所有异步调用完成后,如何调用函数?

仅当来自服务的异步调用完成时,如何调用函数?