BackgroundTaskManager.m 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //
  2. // BackgroundTaskManager.m
  3. //
  4. // Created by Puru Shukla on 20/02/13.
  5. // Copyright (c) 2013 Puru Shukla. All rights reserved.
  6. //
  7. #import "BackgroundTaskManager.h"
  8. @interface BackgroundTaskManager()
  9. @property (nonatomic, strong)NSMutableArray* bgTaskIdList;
  10. @property (assign) UIBackgroundTaskIdentifier masterTaskId;
  11. @end
  12. @implementation BackgroundTaskManager
  13. +(instancetype)sharedBackgroundTaskManager{
  14. static BackgroundTaskManager* sharedBGTaskManager;
  15. static dispatch_once_t onceToken;
  16. dispatch_once(&onceToken, ^{
  17. sharedBGTaskManager = [[BackgroundTaskManager alloc] init];
  18. });
  19. return sharedBGTaskManager;
  20. }
  21. -(id)init{
  22. self = [super init];
  23. if(self){
  24. _bgTaskIdList = [NSMutableArray array];
  25. _masterTaskId = UIBackgroundTaskInvalid;
  26. }
  27. return self;
  28. }
  29. -(UIBackgroundTaskIdentifier)beginNewBackgroundTask
  30. {
  31. UIApplication* application = [UIApplication sharedApplication];
  32. __block UIBackgroundTaskIdentifier bgTaskId = UIBackgroundTaskInvalid;
  33. if([application respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]){
  34. bgTaskId = [application beginBackgroundTaskWithExpirationHandler:^{
  35. //NSLog(@"background task %lu expired", (unsigned long)bgTaskId);
  36. [self.bgTaskIdList removeObject:@(bgTaskId)];
  37. [application endBackgroundTask:bgTaskId];
  38. bgTaskId = UIBackgroundTaskInvalid;
  39. }];
  40. if ( self.masterTaskId == UIBackgroundTaskInvalid )
  41. {
  42. self.masterTaskId = bgTaskId;
  43. //NSLog(@"started master task %lu", (unsigned long)self.masterTaskId);
  44. }
  45. else
  46. {
  47. //add this id to our list
  48. //NSLog(@"started background task %lu", (unsigned long)bgTaskId);
  49. [self.bgTaskIdList addObject:@(bgTaskId)];
  50. [self endBackgroundTasks];
  51. }
  52. }
  53. return bgTaskId;
  54. }
  55. -(void)endBackgroundTasks
  56. {
  57. [self drainBGTaskList:NO];
  58. }
  59. -(void)endAllBackgroundTasks
  60. {
  61. [self drainBGTaskList:YES];
  62. }
  63. -(void)drainBGTaskList:(BOOL)all
  64. {
  65. //mark end of each of our background task
  66. UIApplication* application = [UIApplication sharedApplication];
  67. if([application respondsToSelector:@selector(endBackgroundTask:)]){
  68. NSUInteger count=self.bgTaskIdList.count;
  69. for ( NSUInteger i=(all?0:1); i<count; i++ )
  70. {
  71. UIBackgroundTaskIdentifier bgTaskId = [[self.bgTaskIdList objectAtIndex:0] integerValue];
  72. //NSLog(@"ending background task with id -%lu", (unsigned long)bgTaskId);
  73. [application endBackgroundTask:bgTaskId];
  74. [self.bgTaskIdList removeObjectAtIndex:0];
  75. }
  76. if ( self.bgTaskIdList.count > 0 )
  77. {
  78. //NSLog(@"kept background task id %@", [self.bgTaskIdList objectAtIndex:0]);
  79. }
  80. if ( all )
  81. {
  82. //NSLog(@"no more background tasks running");
  83. [application endBackgroundTask:self.masterTaskId];
  84. self.masterTaskId = UIBackgroundTaskInvalid;
  85. }
  86. else
  87. {
  88. //NSLog(@"kept master background task id %lu", (unsigned long)self.masterTaskId);
  89. }
  90. }
  91. }
  92. @end