Можем ли мы использовать exit (0); [Дубликат]

Краткий ответ: ваш метод foo() возвращается немедленно, а вызов $ajax() выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.

В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo() и сохранить результаты в члене этого объекта после завершения асинхронного вызова.

function foo(result) {
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;   // Store the async result
        }
    });
}

var result = { response: null };   // Object to hold the async result
foo(result);                       // Returns before the async completes

Обратите внимание, что вызов foo() ] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response.

4
задан Martin Prikryl 31 March 2014 в 07:58
поделиться

5 ответов

Из Руководств пользователя для пользователей Apple ...

Не выходить из программы

Никогда не оставляйте приложение iOS программно, потому что люди склонны интерпретировать это как сбой. Однако, если внешние обстоятельства не позволяют вашему приложению функционировать должным образом, вы должны сообщить своим пользователям о ситуации и объяснить, что они могут с этим сделать.

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

. Если только некоторые функции вашего приложения не работают, либо экран, либо предупреждение, когда люди активируют эту функцию. Показывать предупреждение только тогда, когда люди пытаются получить доступ к функции, которая не работает.

Если вы решили, что вы все равно откажетесь от программных средств ...

В C, exit(0) остановит выполнение приложения. Это означает, что никакие методы делегата или обработчики исключений не будут вызваны. Итак, если целью является удостовериться, что какой-то код вызывается, когда закрывается, даже при принудительном закрытии, может быть другой вариант. В вашем AppDelegate реализовать пользовательский метод называется что-то вроде -(void)applicaitonIsgoingAway. Вызовите этот метод из любого места, где вы хотите, чтобы ваш вызывающий код вызывался:

  1. applicationWillTerminate
  2. applicaitonDidEnterBackground
  3. onUncaughtException

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

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

void onUncaughtException(NSException* exception)
{
    [[AppDelegate sharedInstance] applicationIsgoingAway];
}

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSSetUncaughtExceptionHandler(&onUncaughtException);
 //There may already be more code in this method.
}

Теперь вы можете выйти из приложения программно, вызвав NSAssert(FALSE, @"Quitting the app programmatically.");. Пока нет другого обработчика исключений, чтобы поймать это, ваше приложение начнет сбой, и ваше исключение будет вызываться код обработчика. в свою очередь, вызывая applicationIsGoingAway.

17
ответ дан Community 23 August 2018 в 17:08
поделиться

Когда вы вызываете exit(0), вы немедленно прекратите свое приложение. 0 - это код состояния, который означает успешное завершение.

Никакой другой метод не вызывается, приложение просто умирает.

Яблоки препятствуют вам вызывать выход в любом месте.

7
ответ дан Dimme 23 August 2018 в 17:08
поделиться

exit(0) - это функция C, которая завершает процесс вашего приложения, поэтому никто из методов делегирования приложения не будет вызван, приложение будет немедленно уничтожено. Apple рекомендует настоятельно отказаться от вашего приложения, потому что оно кажется нарушенным пользователю.

2
ответ дан Matthew Bischoff 23 August 2018 в 17:08
поделиться

Не поддерживается Apple, чтобы программно завершить приложение. Вызов exit, конечно, не может быть и речи. Это вызывает всевозможные ошибки (например, многозадачный коммутатор сильно сломается), а также просто неправильно.

Если вы пытаетесь отключить многозадачность, вы можете сделать это с помощью клавиши UIApplicationExitsOnSuspend в вашем Файл Info.plist (заголовок для ключа «Приложение не работает в фоновом режиме»).

Кроме этого, вы можете нажать кнопку «домой», чтобы закрыть приложение.

0
ответ дан Mike Weller 23 August 2018 в 17:08
поделиться

эти методы будут вызываться, но вы не можете использовать exit (0), вам нужно нажать кнопку «Назад», чтобы закрыть приложение, после чего эти методы будут называться

-3
ответ дан owen gerig 23 August 2018 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: