如果用户更改了与推送通知相关的设置,我将在 -applicationDidEnterBackground 中启动一个后台任务,将数据上传到我的服务器。当用户更改设置时,我将静态 BOOL 设置为 YES,并且仅在应用程序进入后台时发送更改。我将结束任务的 a 块传递给方法,因此当到达 connectionDidFinishLoading 时,它会调用它并结束任务。
它在模拟器上大部分时间都有效,但在实际设备上无效。
相关代码:
self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^
{
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
[PushInfo checkDirty:^{
NSLog(@"push info sent");
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
});
...
// in PushInfo.m :
typedef void (^VoidBlock)();
static BOOL dirty;
+ (void) checkDirty:(VoidBlock)endBlock
{
if(dirty)
{
PushInfo *pi = [[PushInfo alloc] init];
NSLog(@"sending pushinfo"); // This code is always reached
[pi setEndBlock:endBlock];
[pi updatePushInfo];
}
else
endBlock();
}
- (void) updatePushInfo
{
...
// Create a NSURLConnection to send the data
...
}
- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
...
NSLog(@"sent push info");
dirty = NO;
if(endBlock)
{
endBlock();
}
}
我错过了什么吗?编辑:即使它确实将信息发送到模拟器上的服务器,由于某种原因,静态变量仍然是 YES ......