Ios 将应用程序置于后台时GCD调度的操作未运行

Ios 将应用程序置于后台时GCD调度的操作未运行,ios,grand-central-dispatch,Ios,Grand Central Dispatch,我启动了一个方法,它本质上是一个无止境的循环,使用dispatch\u queue\u create然后dispatch\u async(然后代码循环在调度块内) 这个循环运行得很好。但是,当应用程序背景化时,它会暂停。然后,当应用程序进入前台时,它会重新启动 我怎样才能防止这种情况发生?我一直在寻找,但似乎优先级不是我可以选择的事情之一。使用该方法启动后台任务。操作系统将给您十分钟的时间,并在结束时调用expirationHandler块 如果设备无法在后台运行代码,或者必须使用任务id来结束

我启动了一个方法,它本质上是一个无止境的循环,使用
dispatch\u queue\u create
然后
dispatch\u async
(然后代码循环在调度块内)

这个循环运行得很好。但是,当应用程序背景化时,它会暂停。然后,当应用程序进入前台时,它会重新启动

我怎样才能防止这种情况发生?我一直在寻找,但似乎优先级不是我可以选择的事情之一。

使用该方法启动后台任务。操作系统将给您十分钟的时间,并在结束时调用expirationHandler块

如果设备无法在后台运行代码,或者必须使用任务id来结束,则此方法将返回UIBackgroundTaskInvalid

您可以(而且应该)通过调用-[UIApplication endBackgroundTask]更快地结束它


您可能可以在块的开头开始一个任务,并在它结束时结束它,如果它是一个无休止的循环,只需在applicationWillResignActive方法中启动一个任务,然后在applicationdidebomeactive上结束它。但请记住,您只有十分钟的时间,您的应用程序将有更多的时间使用位置、音频或voip。

您想在iOS后台无限循环吗?@pcperini是的,我正在轮询队列。我在无休止的循环中加入了等待,所以我不会耗尽你的iPad电池:)……我很确定这没关系。除非你的应用是手机(Skype)或音乐播放器(Spotify),否则你不能在后台运行无限循环。你应该做的(就苹果而言)是使用推送更新数据。@pcperini的问题是我的应用程序(MIDI设计器)处理MIDI输入并生成MIDI输出。99%的用户会在使用该应用程序时查看它,但我至少有一个用户希望在同一台iPad上查看另一个应用程序。所以我想知道我的可能性有多大。@pcperini我还应该注意到,从经验上看,它工作得很好(但不是在应用程序有背景的时候),现在它在应用程序商店里销售。这两个都没有意义,但它们可能是某些事情的线索。这太神奇了(刚刚尝试过)。所以基本上我要延长10分钟,然后我就死在水里了?没办法,对吧?我想没问题,但只要检查一下……只有当你决定使用“苹果认可”的后台任务类型时。如果您播放音频,您的应用程序将在后台被调用以提供更多音频数据,如果您需要位置更新,您的应用程序将在后台得到通知,在voip中,我不知道它是如何工作的,但它有一个额外的好处,它将使用操作系统启动您的应用程序^^我们的应用程序因执行“稍多”操作而被重复使用而不是在后台向音频队列提供音频数据^^^但你可能比我们幸运。如果你的应用程序表现得像音乐应用程序一样,你会得到无限的背景:即,音乐永远播放,直到用户说“停止”。苹果批准使用我描述的后台任务的应用程序,但在常识范围内,我认为,我想你不能消耗太多的电池。但我认为您正在做的很好,这是一项用户希望在后台运行的任务。