Core Data iCloud 获取有时不会产生数据(iOS)

Posted

技术标签:

【中文标题】Core Data iCloud 获取有时不会产生数据(iOS)【英文标题】:Core Data iCloud fetch sometimes yields no data (iOS) 【发布时间】:2015-10-14 02:31:31 【问题描述】:

我在使用 iCloud Core Data 的测试应用程序中遇到问题。当触摸表格视图中的部分条目时会触发特定问题,这会触发整个表格条目在全屏上显示。一种标准的表格视图。

表格视图单元格包含一个唯一的记录 ID,该 ID 被传递到详细显示视图中。在启动视图时,视图控制器会使用完整的记录数据并将其绘制在屏幕上。

这是用于执行此操作的代码:

- (void)viewDidLoad 
    [super viewDidLoad];

    NSString *temp_text;
    Item *fetchSelectedItem;
    NSString *updateUniqueID;
    NSArray *tempFetchedObjects;
    NSError *error;
    int stopper;

    localFindItDataController = [[FindItDataController alloc] init];

    NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Item"  inManagedObjectContext: localFindItDataController.managedObjectContext];
    [fetch setEntity:entityDescription];
    updateUniqueID = [localItem.itemUniqueID stringValue];
    [fetch setPredicate:[NSPredicate predicateWithFormat:@"(ANY itemUniqueID = %@)",updateUniqueID]];

    tempFetchedObjects = [localFindItDataController.managedObjectContext executeFetchRequest:fetch error:&error];
    NSLog(@"did the fetch work %@ %lu", updateUniqueID, (unsigned long)[tempFetchedObjects count]);
    if ([tempFetchedObjects count] == 0) 
        stopper = 1;

    fetchSelectedItem = [tempFetchedObjects objectAtIndex:0];
    NSLog(@"only executes if fetch was ok");
    localItem = fetchSelectedItem;

    temp_text = localItem.itemName;
    contentsWhatBox.text = temp_text;
    temp_text = localItem.itemLocation;
    contentsWhereBox.text = temp_text;
    temp_text = localItem.itemDescription;
    contentsOtherInfoBox.text = temp_text;

    UIImage *tempImage = [UIImage imageWithData:localItem.itemPicture];
    CGImageRef imageRef = [self CGImageRotatedByAngle:[tempImage CGImage] angle:270];
    UIImage* img = [UIImage imageWithCGImage: imageRef];
    contentsImageBox.image = img;

    tapImage = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapImageGesture)];

    [contentsImageBox setUserInteractionEnabled:YES];

    [contentsImageBox addGestureRecognizer:tapImage];


大多数情况下这工作得很好,但有时即使确实有与 fetch 谓词匹配的数据,fetch 也会出现空。有时我可以点击一个表格视图条目,看到它出现,在表格视图条目之间来回切换几次,回到原始条目并且获取失败。

我有点不知所措,欢迎任何帮助。提前致谢。

编辑#1:

这是正在获取的对象。可能很重要,所以我稍后添加:

@interface Item : NSManagedObject 


@property (nonatomic, retain) NSString * itemName;
@property (nonatomic, retain) NSString * itemLocation;
@property (nonatomic, retain) NSString * itemDescription;
@property (nonatomic, retain) NSData   * itemPicture;
@property (nonatomic, retain) NSNumber * itemUniqueID;
@property (nonatomic, retain) NSNumber * itemNumber1;
@property (nonatomic, retain) NSNumber * itemNumber2;
@property (nonatomic, retain) NSString * itemAttribute1;
@property (nonatomic, retain) NSString * itemAttribute2;
@property (nonatomic, retain) NSString * itemAttribute3;
@property (nonatomic, retain) NSString * itemTimestamp;


@end

编辑#2:

我忘了提到在“错误”提取之后提取的错误对象为零。

编辑#3:

添加了一个循环来检查我是否得到了结果,并在退出之前重试了一定次数,并且工作正常。我不确定为什么会这样,但我怀疑 iCloud 数据中的图像可能是问题的一部分,即使此时的数据肯定已复制到 ios 测试设备。

【问题讨论】:

【参考方案1】:

添加了一个循环来检查我是否得到了结果,并在退出之前重试了一定次数,并且工作正常。我不确定为什么会这样,但我怀疑 iCloud 数据中的图像可能是问题的一部分,即使此时的数据肯定已复制到 iOS 测试设备。

【讨论】:

以上是关于Core Data iCloud 获取有时不会产生数据(iOS)的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 应用程序中的 UITableView 不会更新第二个设备的主视图,除非重新启动应用程序,并使用 iCloud 同步

Core Data + iCloud 如何处理来自云端的数据更新

如何将 sqlite 数据库与 Core Data 同步?

Core Data 和 iCloud 出错

处理 iCloud Core Data 错误

iOS Core Data iCloud 同步 - 可选