Таким образом, проблема в том, что вы «удерживаете» цикл выполнения, не позволяя applicationDidEnterBackground возвращаться. iOS нужно очистить после того, как это вернется, поэтому, не делая этого, вы, по сути, ожидаете, что система убьет вас, что она в конечном итоге сделает по своему усмотрению.
Чтобы доказать это, удалите цикл «for» и добавьте следующее в начало делегата приложения:
dispatch_source_t __timer1;
... и затем добавьте это в ваше приложение: didFinishLaunchingWithOptions:
__timer1 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
if (__timer1)
{
dispatch_source_set_timer(__timer1, dispatch_walltime(NULL, 0), 1ull * NSEC_PER_SEC, 1ull * NSEC_PER_SEC);
dispatch_source_set_event_handler(__timer1, ^{
NSLog(@"ping1");
});
dispatch_resume(__timer1);
}
так как теперь вы возвращаетесь из applicationDidEnterBackground, вы получите ожидаемые результаты, "ping1" будет отображаться каждую секунду, пока вы не войдете в фон.