2015-10-20 40 views
1

我的应用程序同步RSS提要约需15-30秒,并为每个同步我请beginBackgroundTaskWithExpirationHandler:。在iOS 7和iOS 8中,一切都很完美。endBackgroundTask:导致“终止由于信号9”

与iOS 9开始调用[[UIApplication sharedApplication] endBackgroundTask: backgroundTask];导致应用程序从调试器的消息崩溃:

由于终止信号9

从我的研究,信号9使用过多意味着,该应用记忆。当我使用仪器时,应用程序永远不会超过30mb或40%cpu。

我知道它来自endBackgroundTask:,因为如果我不叫它,应用程序不会崩溃。然而,一旦我打电话给endBackgroundTask:应用程序每次都会崩溃。

我不知道这里发生了什么问题。我已经尝试了一切。重写代码,移动代码,注释除了endBackgroundTask之外的所有内容。任何帮助或见解将不胜感激。

下面的代码:

@interface SyncClass() 

      @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; 
    @end 

    -(void)startSync 
    { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      [self beginBackgroundUpdateTask]; 
      // I then call my syncing code [syncClass sync]; 

     }); 


      //When sync is done call endBackgroundTask 
      [self endBackgroundUpdateTask]; 
    }  

    - (void) beginBackgroundUpdateTask 
    { 
     NSLog(@"Background Time:%f",[[UIApplication sharedApplication] backgroundTimeRemaining]); 

     self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
      [self endBackgroundUpdateTask]; 
     }]; 

    } 

    - (void) endBackgroundUpdateTask 
    { 
     [[UIApplication sharedApplication] endBackgroundTask: self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
     NSLog(@"Ending background task"); 
    } 
+1

你在后台线程? – matt

+0

您好,是的同步方法是从另一个控制器使用被称为:dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ { [syncManger startSync]; });刚更新的问题反映。谢谢! – TopReads

+1

嗯,根据你所说的,我没有很好的解释。它可能是'sync'代码中的东西,你没有显示的代码?可以_什么是使用太多内存?这可能是有道理的,因为当你调用'endBackgroundTask'时,运行时会暂停你并发现你在后台使用了太多的内存(在此之前,因为你还在运行,所以你不能终止)。一般来说,我建议你认真对待这个信息:在进入后台时,你应该已经尝试释放资源以减少内存使用量。 – matt

回答

1

这里回答我的问题。 AFNetworking和FMDB碰巧已经过时。通过可可豆荚更新它们似乎解决了这个问题。

+1

今天有同样的问题。在AFNetworking回调模块的背景中调用'endBackgroundTask:'时发生崩溃。通过将调用包装为dispatch_after中的'endBackgroundTask:'来修复它。 – voidStern

相关问题