Я не уверен, что использование присоединяемого потока позволяет отложить завершение приложения, пока ваш поток не будет завершен и вы не присоединитесь к нему. Возможно нет. Вы можете использовать потоки POSIX вместо NSThread или NSOperation / NSOperationQueue, но вам все равно придется учитывать возможность прекращения работы приложения пользователем.
Теперь прекращение может произойти одним из двух возможных способов:
1) приложение получает сигнал SIGTERM, который вы можете перехватить через applicationWillTerminate: метод, который затем является обработчиком сигнала SIGTERM;
2) приложение получает SIGKILL: в этом случае вы не можете перехватить сигнал через обработчик сигнала, и вы не можете (конечно) игнорировать его, устанавливая расположение сигнала.
Если SIGTERM - единственный сигнал, отправляемый для завершения приложения, тогда вы сможете продолжить работу в потоке, чтобы сохранить данные и выйти изящно. Однако может случиться так, что по истечении тайм-аута (те 5 секунд, которые вы упомянули) приложение также получает SIGKILL, и это событие вызывает его немедленное завершение. Это может быть тем, что происходит на самом деле, когда пользователь нажимает кнопку «Домой»: iPhone OS отправляет приложение SIGTERM, запускает таймер, а по истечении времени ожидания отправляет SIGKILL. Но ничто в документации не подтверждает это (или опровергает это, насколько мне известно).
Чтобы справиться с этим, вы должны приложить все усилия (конечно, в зависимости от приложения), чтобы сохранить состояние приложения атомарно и как можно скорее, и вы должны быть готовы отменить ваш поток POSIX (когда он достигнет одной из возможных точек отмены) ) и отката по мере необходимости для очистки перед выходом.