用 NSFetchRequest => [array count] 填充 NSArray 错误

Posted

技术标签:

【中文标题】用 NSFetchRequest => [array count] 填充 NSArray 错误【英文标题】:Fill NSArray with NSFetchRequest => [array count] wrong 【发布时间】:2011-12-06 11:51:45 【问题描述】:

我有一个自定义的NSManagedObject,它有几个属性。我allocinit 对象的两个实例:compare1compare2。然后我执行NSFetchRequest 来获取其中两个自定义对象并将它们的属性填充到NSArray 结构中,以便稍后在UITableView 中显示它们。

我的问题是,UITableView 崩溃了。我对代码进行了一些研究,发现有时数组没有完整的计数。当我玩我的滑块和文本字段时,它有时会起作用,但它(至少对我而言)是不可重现的。

提前谢谢你!

编辑:问题现在很清楚了。 object description 已完成。我通过NSArray * array = [[NSArray alloc] initWithObjects: object.value1, ..., nil]; 将其转移到NSArray。现在奇怪的是:[array count] 给了我一个错误的号码?只有 != 0 的值在数组中。为什么这样?谢谢!

这是NSFetchRequest的代码:

-(NSArray *)performFetch


if (__managedObjectContext == nil)

    __managedObjectContext = [(MasterViewController *)[[UIApplication sharedApplication] delegate] managedObjectContext];


NSError *error = nil;

NSManagedObjectContext *context = [self managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

NSLog(@"FetchedObjects Count: %i", [fetchedObjects count]); //always right

compare1 = [fetchedObjects objectAtIndex:0]; //compare is a custom NSObject
compare2 = [fetchedObjects objectAtIndex:1]; //with several properties (.1 to .17)

NSLog(@"%@",[compare1 description]); //is complete
NSLog(@"%@",[compare2 description]); //is complete

NSArray * valuesS1 = [[NSArray alloc] initWithObjects:compare1.1,__andsoon__compare1.14, nil];

NSArray * valuesB1 = [[NSArray alloc] initWithObjects:compare1.14__andsoon__compare1.17, nil];


NSArray * valuesS2 = [[NSArray alloc] initWithObjects:compare2.1,__andsoon__compare2.14, nil];

NSArray * valuesB2 = [[NSArray alloc] initWithObjects:compare2.14__andsoon__compare2.17, nil];


NSMutableArray * valuesArray1 = [[NSMutableArray alloc] initWithObjects:valuesS1, valuesB1, nil];
NSMutableArray * valuesArray2 = [[NSMutableArray alloc] initWithObjects:valuesS2, valuesB2, nil];


compareArray = [[NSMutableArray alloc] initWithObjects:valuesArray1, valuesArray2, nil];

NSLog(@"Array1 count: %i",[values1 count]); //sometimes (I don't know why)
NSLog(@"Array2 count: %i",[values2 count]); //[values1 count] != [values2 count]

return compareArray; //sometimes returns an array with too less objects so my UITableView crashes

【问题讨论】:

【参考方案1】:

只有 != 0 的值在数组中

您不能将nil 值直接添加到数组中。 (nil 通常为零。)如果您需要将“空”值添加到数组中,则需要检查并插入 NSNull 值。例如:

NSArray * valuesS1 = [[NSArray alloc] initWithObjects:val1 ? val1 : [NSNull null], val2 ? val2 : [NSNull null], nil];

编辑

?: 相当于:

if (val1) 
  return val1;

else 
  return [NSNull null];

如果你想使用@"0" 而不是NSNull 你可以;它可以是任何你喜欢的东西,只要它是一个对象而不是nil

【讨论】:

感谢您的贡献。这听起来是一个好的开始,但是您能否将您的示例作为伪代码给我,以便我更好地理解代码?我也可以将零作为NSString 提供给数组吗?在您的代码中,它将类似于:...initWithObjects:val1 ? val1 : [@"0"], val2 ... 这可能吗?因为我重用这些值来为某些滑块提供初始值,现在我通过slider.value = [object.property intValue] 执行此操作 这个不错!谢谢!只是对所有想要添加NSString的人来说都是完整的:NSArray * valuesS1 = [[NSArray alloc] initWithObjects:val1 ? val1 : [NSString stringWithFormat: @"0"], nil]; 你可以这样做:NSArray * valuesS1 = [[NSArray alloc] initWithObjects:val1 ? val1 : @"0", nil];stringWithFormat: 部分是不必要的。

以上是关于用 NSFetchRequest => [array count] 填充 NSArray 错误的主要内容,如果未能解决你的问题,请参考以下文章

无法转换'NSFetchRequest类型的值 '到指定类型'NSFetchRequest “

NSFetchRequest 返回具有 <invalid> 类型元素的数组

无法使用类型为“(NSFetchRequest<NSFetchRequestResult>)”的参数列表调用“获取”

核心数据 NSFetchrequest 整数

NSFetchRequest 用于行中的子对象

如何将类型应用于NSFetchRequest实例?