Fli*_*per 2 iphone memory-management objective-c multidimensional-array nspredicate
这个问题基于我上一个问题的相同应用程序/来源,可以在这里找到:
我有一个嵌套的数组,打印出来时看起来像这样(我只复制并粘贴了它的一小部分).
(
(
<Term: 0x4256420>,
<Term: 0x420fa40>,
<Term: 0x4257bd0>,
<Term: 0x4257cf0>,
<Term: 0x4257d90>,
<Term: 0x4257e30>
),
(
<Term: 0x4257e50>,
<Term: 0x4257f90>,
<Term: 0x4257fb0>,
<Term: 0x42580e0>,
<Term: 0x4258170>,
<Term: 0x4258210>,
<Term: 0x4258230>,
<Term: 0x4258360>,
<Term: 0x4258400>,
<Term: 0x42584a0>,
<Term: 0x4258540>,
<Term: 0x42585e0>,
<Term: 0x4258670>,
<Term: 0x4258710>
),
Run Code Online (Sandbox Code Playgroud)
这是我的表的搜索部分的代码:
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
{
// Normal table
if (aTableView == self.tableView) return [[self.sectionArray objectAtIndex:section] count];
// Search table
//NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
//self.filteredArray = [self.crayonColors filteredArrayUsingPredicate:predicate];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
self.filteredArray = [[self.sectionArray objectAtIndex:section] filteredArrayUsingPredicate:predicate];
return self.filteredArray.count;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误,我无法分配足够的空间,这意味着我必须做错事,我只是无法弄清楚是什么.
上面方法中搜索部分的注释部分可以正常工作,但是crayonColors只是NSStrings的一个简单的NSMutableDictionary,并且没有嵌套在其中的数组.
提前致谢!
Dav*_*ong 11
据我所知,你不能用一个谓词做到这一点.但是,您可以使用键路径运算符和两个单独调用中的谓词来完成此操作.
所以,你有一系列术语数组.您需要一个名称包含"A"的单个术语数组(例如).这是你做的:
NSArray * allTerms = ...; //your array of arrays of terms
NSArray * collapsedTerms = [allTerms valueForKeyPath:@"@unionOfArrays.self"];
NSPredicate * filter = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"A"];
NSArray * filteredTerms = [collapsedTerms filteredArrayUsingPredicate:filter];
Run Code Online (Sandbox Code Playgroud)
这里的魔力就是一valueForKeyPath:点点.在@unionOfArrays操作者取对象的数组的数组,并返回对象的数组.这是它正在做的事情:NSArray它将打破关键路径.,给予它@unionOfArrays和self.它将valueForKeyPath:使用第二位(self)进行递归和调用,并且它将返回一个数组数组.然后它将所有这些数组混合成一个数组,忽略重复.(如果要删除重复项,请@distinctUnionOfArrays改用)
一旦我们拥有了那个对象数组,我们就可以使用一个简单的name CONTAINS 'blah'谓词来正常过滤它.
(我以为我可能能够使用它来使用它SUBQUERY,但这是一个奇怪的野兽,对我来说没有什么是明显的.)
对于超级强悍,你可以用KickingBear的集合扩展(一个方法调用做到这一点可在这里),但我会强烈建议不要使用这样的黑客在生产环境.:)
| 归档时间: |
|
| 查看次数: |
2827 次 |
| 最近记录: |