AFNetworking 2.0,使用CoreData(MagicalRecord)保存下载状态

时间:2014-03-05 16:25:38

标签: ios iphone objective-c magicalrecord afnetworking-2

我遇到使用AFNetworking 2.0和MagicalRecord的应用程序的问题。此应用程序从播客站点中的小JSON API下载数据,并将每个播客节目存储在Podcast实体中。

此Podcast实体有另一个名为PodcastDownload的实体,可在下载播客时保留信息(下载状态和进度)。在这个PodcastDownload实体中,我使用KVO更新此信息,从NSURLSessionDownloadTask观察NSProgress对象和状态。这很好。

但是当我尝试使用此方法在名为PodcastManager的单例实例中保存数据上下文中的下载状态时,我遇到了问题:

- (void)saveContext{

  [[NSManagedObjectContext defaultContext] saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {

  if (success) {
    NSLog(@"Save OK");
  } else if(error) {
    NSLog(@"Error %@", error.description);
  }

 }];
}

当我调用此方法时,我从AFNetworking在AFURLSessionManager中收到此EXC_BAD_ACCESS错误,但根据我的日志保存似乎运行正常:

EXC_BAD_ACCESS error

Context BACKGROUND SAVING (ROOT) is about to save. Obtaining permanent IDs for new 1 inserted objects

我不知道导致此错误的原因。我也尝试使用MagicalRecord方法 saveWithBlock ,但我得到了相同的结果。

这是我在PodcastDownload中的KVO Observer的源代码:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
 {
  if (context == PodcastDownloadContext) {

  if ([object isKindOfClass:[NSURLSessionDownloadTask class]]) {

    NSURLSessionDownloadTask *task = (NSURLSessionDownloadTask *) object;



    if (task.state == NSURLSessionTaskStateRunning) {
      [self setStatus:PodcastDownloadRunning];
      [[PodcastManager sharedManager] saveContext];
    }

    if (task.state == NSURLSessionTaskStateSuspended) {
      [self setStatus:PodcastDownloadSuspended];
      [[PodcastManager sharedManager] saveContext];
    }

    if (task.state == NSURLSessionTaskStateCanceling) {
      [self setStatus:PodcastDownloadCanceling];
      self.downloadTask = nil;
      self.data = nil;
      self.progress = 0;
      [[PodcastManager sharedManager] saveContext];
    }

    if (task.state == NSURLSessionTaskStateCompleted) {

      if (self.status == PodcastDownloadCanceling) {
        [self setStatus:PodcastDownloadNotSet];
      } else {
        [self setStatus:PodcastDownloadCompleted];
        self.downloadTask = nil;
        self.data = nil;
        self.progress = 0;
        [[PodcastManager sharedManager] saveContext];
      }

      @try {
        [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(state)) context:PodcastDownloadContext];
        [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(fractionCompleted)) context:PodcastDownloadContext];
      }
      @catch (NSException * __unused exception) {}
    }

  }
 }
}

非常感谢

1 个答案:

答案 0 :(得分:0)

好吧,做一些改变我找到了解决方案,但不是原因。

我的Core Data堆栈中有三个实体(Podcast,PodcastDownload和PodcastPlayback)。主要实体是Podcast,PodcastDownload用于保存有关下载的信息,正如我在我的问题中所解释的那样。

我所做的是从PodcastDownload中取出属性并将它们放入Podcast实体中。而现在似乎应该工作。

我不知道错误的确切原因,但我认为它与线程有关(抱歉,我仍然是一个带有objective-c的小菜鸟)。

感谢您的帮助。