Ios NSDictionary数据不会传递到另一个ViewController

Ios NSDictionary数据不会传递到另一个ViewController,ios,uiviewcontroller,nsdictionary,Ios,Uiviewcontroller,Nsdictionary,我需要将2个NSDictionary从一个ViewController传递到另一个ViewController,我的应用程序有时会传递数据,但有时数据不会到达第二个ViewController 我需要咨询web服务两次,web服务响应是JSON,这个JSON(2)是我需要传递给其他ViewController的 对web服务的调用在此处进行(在dispatch\u async中): 这段代码工作正常,但是,有时在我更改ViewController之后会出现响应(dataResponse),我不知

我需要将2个NSDictionary从一个ViewController传递到另一个ViewController,我的应用程序有时会传递数据,但有时数据不会到达第二个ViewController

我需要咨询web服务两次,web服务响应是JSON,这个JSON(2)是我需要传递给其他ViewController的

对web服务的调用在此处进行(在dispatch\u async中):

这段代码工作正常,但是,有时在我更改ViewController之后会出现响应(dataResponse),我不知道如果dataResponse没有出现,为什么会更改ViewController

您看,我实例化了第二个ViewController,设置了数据,并在调度_上更改了ViewController(4.0秒)。 为什么我在调度中更改ViewController?因为,如果我不在之后实现dispatch_,NSDictionary总是空的!,这样,NSDictionary有时为空,有时为ok

你能告诉我为什么我的代码有问题吗


PS:字典在另一个ViewController中显示为空(没有元素,但不为空)。

这里有一条建议:不要阻塞主线程,不要调用主线程睡眠

这是一个并发问题,方法
setConnectionAndRequest:urlConsultarDisponibilidad
应该是异步的,UI代码可能在两个响应之前执行。我想可以这样解决:

double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t) (delayInSeconds * NSEC_PER_SEC));
dispatch_queue_t queue = dispatch_queue_create("com.micrologica.modules", nil);

dispatch_async(queue, ^{
    urlConsultarDisponibilidad = [NSString stringWithFormat:connectionUrl getAvailableModuleListAPI, fechaDiaUno, idLocal, idServicioUno, idProfesionalUno, idServicioDos, idProfesionalDos];
    [FunctionsAmano setConnectionAndRequest:urlConsultarDisponibilidad completion:^(NSDictionary *dataResponse) {
        NSLog(@"response dia 1: %@", dataResponse);
        if(dataResponse) {
            NSString *resp = [NSString stringWithFormat:@"%@", [dataResponse objectForKey:@"resp"]];
            if([resp isEqualToString:@"1"]) {
                NSLog(@"almost finish 1");
                modulesDiaUno = [dataResponse objectForKey:@"data"];
            }

            dispatch_after(popTime, queue, ^(void){
                finishedDiaUno = YES;
                NSLog(@"finished 1");

                if (finishedDiaDos) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        HorariosViewController *horariosView = [self.storyboard instantiateViewControllerWithIdentifier:@"ModulesView"];
                        horariosView.modulesDiaUno = self.modulesDiaUno;
                        horariosView.modulesDiaDos = self.modulesDiaDos;
                        [self presentViewController:horariosView animated:NO completion:nil];
                    });
                }
            });
        }
    }];
});

dispatch_async(queue, ^{
    urlConsultarDisponibilidad = [NSString stringWithFormat:connectionUrl getAvailableModuleListAPI, fechaDiaDos, idLocal, idServicioUno, idProfesionalUno, idServicioDos, idProfesionalDos];
    [FunctionsAmano setConnectionAndRequest:urlConsultarDisponibilidad completion:^(NSDictionary *dataResponse) {
        NSLog(@"response dia 2: %@", dataResponse);
        if(dataResponse) {
            NSString *resp = [NSString stringWithFormat:@"%@", [dataResponse objectForKey:@"resp"]];
            if([resp isEqualToString:@"1"]) {
                NSLog(@"almost finish 2");
                modulesDiaDos = [dataResponse objectForKey:@"data"];
            }

            dispatch_after(popTime, queue, ^(void){
                finishedDiaDos = YES;
                NSLog(@"finished 2");

                if (finishedDiaUno) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        HorariosViewController *horariosView = [self.storyboard instantiateViewControllerWithIdentifier:@"ModulesView"];
                        horariosView.modulesDiaUno = self.modulesDiaUno;
                        horariosView.modulesDiaDos = self.modulesDiaDos;
                        [self presentViewController:horariosView animated:NO completion:nil];
                    });
                }
            });
        }
    }];
});

“空”是什么意思
horariosView.modulesDiaUno
存在,但没有元素或元素为零。你好,KudoCC,我用另一段代码实现了信息。谢谢可能重复我正在测试你的代码,这似乎可行,但我有一个问题,在你的代码中,我打了两次电话来更改ViewController?一次finishDiaUno为是,一次finishedDiaDos为是,这会影响到某些东西?它不会调用两次,因为队列是串行的,如果第一个响应先到,
finishedDiaUno
将首先设置为是,但
finishedDiaDos
为否,因此不会显示ViewController,然后第二个反应来了,finishedDiaUno和finishedDiaDos都是YES,将会出现viewcontroller。太棒了!非常感谢你!,我做了40次测试,没有一次不及格!!!在你帮助我之前,我的代码失败了4到5次!非常感谢你!建议阅读:谢谢,我知道我需要阅读有关IOS编程的内容,我只在IOS上编程了2周,但问题解决后,应用程序就完成了!,现在我有时间读书和学习:)
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t) (delayInSeconds * NSEC_PER_SEC));
dispatch_queue_t queue = dispatch_queue_create("com.micrologica.modules", nil);

dispatch_async(queue, ^{
    urlConsultarDisponibilidad = [NSString stringWithFormat:connectionUrl getAvailableModuleListAPI, fechaDiaUno, idLocal, idServicioUno, idProfesionalUno, idServicioDos, idProfesionalDos];
    [FunctionsAmano setConnectionAndRequest:urlConsultarDisponibilidad completion:^(NSDictionary *dataResponse) {
        NSLog(@"response dia 1: %@", dataResponse);
        if(dataResponse) {
            NSString *resp = [NSString stringWithFormat:@"%@", [dataResponse objectForKey:@"resp"]];
            if([resp isEqualToString:@"1"]) {
                NSLog(@"almost finish 1");
                modulesDiaUno = [dataResponse objectForKey:@"data"];
            }

            dispatch_after(popTime, queue, ^(void){
                finishedDiaUno = YES;
                NSLog(@"finished 1");

                if (finishedDiaDos) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        HorariosViewController *horariosView = [self.storyboard instantiateViewControllerWithIdentifier:@"ModulesView"];
                        horariosView.modulesDiaUno = self.modulesDiaUno;
                        horariosView.modulesDiaDos = self.modulesDiaDos;
                        [self presentViewController:horariosView animated:NO completion:nil];
                    });
                }
            });
        }
    }];
});

dispatch_async(queue, ^{
    urlConsultarDisponibilidad = [NSString stringWithFormat:connectionUrl getAvailableModuleListAPI, fechaDiaDos, idLocal, idServicioUno, idProfesionalUno, idServicioDos, idProfesionalDos];
    [FunctionsAmano setConnectionAndRequest:urlConsultarDisponibilidad completion:^(NSDictionary *dataResponse) {
        NSLog(@"response dia 2: %@", dataResponse);
        if(dataResponse) {
            NSString *resp = [NSString stringWithFormat:@"%@", [dataResponse objectForKey:@"resp"]];
            if([resp isEqualToString:@"1"]) {
                NSLog(@"almost finish 2");
                modulesDiaDos = [dataResponse objectForKey:@"data"];
            }

            dispatch_after(popTime, queue, ^(void){
                finishedDiaDos = YES;
                NSLog(@"finished 2");

                if (finishedDiaUno) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        HorariosViewController *horariosView = [self.storyboard instantiateViewControllerWithIdentifier:@"ModulesView"];
                        horariosView.modulesDiaUno = self.modulesDiaUno;
                        horariosView.modulesDiaDos = self.modulesDiaDos;
                        [self presentViewController:horariosView animated:NO completion:nil];
                    });
                }
            });
        }
    }];
});