0

我正在使用GCD以及核心數據。我知道核心數據不是線程安全的,所以我使用mainContext作爲父項創建子託管對象上下文(tempContext)。 MainContext有一個PCS來保存數據。我正在做的是:從Facebook無法添加託管對象ID到GCD中的NSMutableArray與子託管對象子上下文

  1. 拉帖子
  2. 保存各崗位核心數據通過創建所謂的後一個新的管理對象,更新它,並將其保存
  3. ,而我處理每一個職位,如果它需要額外的處理,我將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 --"); 
}); 

}

預先感謝您的幫助!

回答

0

我是個白癡。我忘了初始化_postsNeedingPhotos:

_postsNeedingPhotos = [[NSMutableArray alloc] init];

現在一切正常...... :)

相關問題