我遇到使用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错误,但根据我的日志保存似乎运行正常:
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) {}
}
}
}
}
非常感谢
答案 0 :(得分:0)
好吧,做一些改变我找到了解决方案,但不是原因。
我的Core Data堆栈中有三个实体(Podcast,PodcastDownload和PodcastPlayback)。主要实体是Podcast,PodcastDownload用于保存有关下载的信息,正如我在我的问题中所解释的那样。
我所做的是从PodcastDownload中取出属性并将它们放入Podcast实体中。而现在似乎应该工作。
我不知道错误的确切原因,但我认为它与线程有关(抱歉,我仍然是一个带有objective-c的小菜鸟)。
感谢您的帮助。