我正在使用GCD以及核心數據。我知道核心數據不是線程安全的,所以我使用mainContext作爲父項創建子託管對象上下文(tempContext)。 MainContext有一個PCS來保存數據。我正在做的是:從Facebook無法添加託管對象ID到GCD中的NSMutableArray與子託管對象子上下文
- 拉帖子
- 保存各崗位核心數據通過創建所謂的後一個新的管理對象,更新它,並將其保存
- ,而我處理每一個職位,如果它需要額外的處理,我將post.obectID添加到託管對象IDS的NSMutableArray。這個NSMutableArray被另一個進程用來完成更新帖子。我正在使用對象ID,因爲單獨的進程不會在同一個tempContext中,因此我將使用對象ID從核心數據獲取帖子。
的過程中獲取數據,我看到它存儲store.data(我使用一個稱爲基地的產品來查看物理數據庫文件的內容)之內。但是,我似乎無法存儲帖子的對象ID。正如你在代碼中看到的那樣,我使用NSLog來打印帖子的對象ID,並且看到它們,因此我知道對象ID在那裏。代碼還顯示我正在做[tempContext保存],我正在做[mainContext save:],因此我現在應該有永久的,而不是臨時的對象ID的帖子。同樣,數據在覈心數據的物理文件中,但可變數組仍然爲0.
我在做什麼錯誤將對象ID保存到NSMutableArray?在代碼中,你會看到我已經嘗試在主Queue上運行[mutableArray addObject:p.objectID],但這並不重要。
這裏是我的代碼:
- (void)processPosts {
NSLog(@"-- Begin processPosts --");
dispatch_async(_processPostsQ, ^{
for (NSDictionary * info in _posts)
{
NSManagedObjectContext * tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
tempContext.parentContext = mainMOContext;
// If Post exists, rewrite over top of it. otherwise create a new one
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [[mainMOModel entitiesByName] objectForKey:@"Post"];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"fb_post_id = %@",
[info objectForKey:@"post_id"]];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"fb_post_id" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sd]];
NSError * error = nil;
NSArray * fetchResults = [tempContext executeFetchRequest:fetchRequest error:&error];
Post * p = [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:tempContext];
if (fetchResults.count > 0)
{
p = [fetchResults objectAtIndex:0];
}
NSDictionary * appData = [[NSDictionary alloc]init];
appData = [info objectForKey:@"app_data"];
p.fb_actor_id = [info objectForKey:@"actor_id"];
p.fb_app_data = [self archivedData:[info objectForKey:@"app_data"]];
p.fb_attachment = [self archivedData:[info objectForKey:@"attachment"]];
p.fb_created_time = [info objectForKey:@"created_time"];
p.timestamp = [info objectForKey:@"updated_time"];
p.fb_attribution = NULL_TO_NIL([info objectForKey:@"attribution"]);
p.fb_message = NULL_TO_NIL([info objectForKey:@"message"]);
p.fb_type = NULL_TO_NIL([info objectForKey:@"type"]);
p.fb_post_id = [info objectForKey:@"post_id"];
p.fb_likes_info = [self archivedData:[info objectForKey:@"like_info"]];
p.fb_comments_info = [self archivedData:[info objectForKey:@"comment_info"]];
p.fb_parent_post_id = NULL_TO_NIL([info objectForKey:@"parent_post_id"]);
p.fb_permalink = NULL_TO_NIL([info objectForKey:@"permalink"]);
p.fb_photo_data = nil;
p.fb_place = NULL_TO_NIL([info objectForKey:@"places"]);
p.fb_source_id = [info objectForKey:@"source_id"];
p.social_network = @"facebook";
p.fkPostToFriend = [[FriendStore sharedStore]findFriendWithFBUID:[info objectForKey:@"source_id"] withMOContext:tempContext];
[tempContext save:&error];
dispatch_async(dispatch_get_main_queue(), ^{
NSError * error;
[mainMOContext save:&error];
});
if (appData.count > 0)
{
if ([[appData objectForKey:@"photo_ids"] count] > 0)
{
NSLog(@" -- photos need to be loaded for postID: %@",p.objectID);
//dispatch_async(dispatch_get_main_queue(), ^{
[_postsNeedingPhotos addObject:p.objectID];
//});
}
}
}
NSLog(@"ProcessPosts: num of posts needing photos: %d",_postsNeedingPhotos.count);
dispatch_async(_getPhotosQ, ^{
[self loadPhotoData];
});
NSLog(@"-- End processPosts --");
});
}
預先感謝您的幫助!