Objective-C последовательно выполняет два блока завершения

В настоящее время я работаю над тем, чтобы дать возможность продукту DJI самостоятельно выполнять миссии с путевыми точками, адаптируясь из учебника DJI ( https://developer.dji.com/mobile-sdk/documentation/ios-tutorials/GSDemo.html). Поэтому я пытаюсь объединить все процессы в одну функцию. Вот два блока завершения, которые мне нужно было бы интегрировать:

[[self missionOperator] uploadMissionWithCompletion:^(NSError * _Nullable error) {
    if (error){
        ShowMessage(@"Upload Mission failed", error.description, @"", nil, @"OK");
    }else {
        ShowMessage(@"Upload Mission Finished", @"", @"", nil, @"OK");
    }
}];

а также:

[[self missionOperator] startMissionWithCompletion:^(NSError * _Nullable error) {
    if (error){
        ShowMessage(@"Start Mission Failed", error.description, @"", nil, @"OK");
    }else
    {
        ShowMessage(@"Mission Started", @"", @"", nil, @"OK");
    }
}];

Для того, чтобы второй успешно работал, первый должен сначала исполниться полностью. Это не кажется сложной проблемой, но я не смог понять это после попытки добавить задержки или отправки.

Любая помощь приветствуется. Благодарю.

2 ответа

Из версии iOS для документов, на которые вы ссылаетесь, документы для -[DJIWaypointMissionOperator uploadMissionWithCompletion:] сказать:

Если он запущен успешно, используйте addListenerToUploadEvent:withQueue:andBlock получить подробный прогресс.

Итак, вы бы сделали что-то вроде этого:

[[self missionOperator] uploadMissionWithCompletion:^(NSError * _Nullable error) {
    if (error)
    {
        ShowMessage(@"Upload Mission failed", error.description, @"", nil, @"OK");
    }
    else
    {
        ShowMessage(@"Upload Mission Started", @"", @"", nil, @"OK");

        [[self missionOperator] addListenerToUploadEvent:self
                                               withQueue:nil
                                                andBlock:^(DJIWaypointMissionUploadEvent *event){
            if (event.currentState == DJIWaypointMissionStateReadyToExecute)
            {
                [[self missionOperator] startMissionWithCompletion:^(NSError * _Nullable error) {
                    if (error)
                    {
                        ShowMessage(@"Start Mission Failed", error.description, @"", nil, @"OK");
                    }
                    else
                    {
                        ShowMessage(@"Mission Started", @"", @"", nil, @"OK");
                    }
                }];
            }
            else if (event.error)
            {
                ShowMessage(@"Upload Mission failed", event.error.description, @"", nil, @"OK");
            }
        }];
    }
}];

Ваш код выглядит правильно. Я столкнулся с той же проблемой, из-за которой после завершения загрузки моей миссии мой оператор миссии currentState вернется к DJIWaypointMissionStateReadyToUpload скорее, чем DJIWaypointMissionStateReadyToExecute, Миссия прошла проверку достоверности, но на самом деле была недействительной из-за неверных требований кривой на отдельных путевых точках (cornerRadiusInMeters имущество).

Из документации:

/**
 *  Corner radius of the waypoint. When the flight path mode  is
 *  `DJIWaypointMissionFlightPathCurved` the flight path near a waypoint will be  a
 *  curve (rounded corner) with radius [0.2,1000]. When there is a corner radius,
 *  the aircraft will never  go through the waypoint. By default, the radius is 0.2
 *  m. If the corner is made of three adjacent waypoints (Short for A,B,C)  . Then
 *  the radius of A(short for Ra) plus radius of B(short for Rb) must be smaller
 *  than the distance between  A and B. The radius of the first and the last
 *  waypoint in a mission does not affect the flight path and it should keep the
 *  default value (0.2m).
 */

Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам