NSArray *arrClient = [[NSArray alloc] initWithObjects:@"record 1", @"record 2", nil];
NSArray *arrServer = [[NSArray alloc] initWithObjects:@"record 1", @"record 3", nil];
對arrServer
我想應用謂詞來僅篩選那些在arrClient
中不存在的條目。例如在這種情況下,record 1
存在於兩個數組中,並且應該被忽略,因此只有具有「記錄3」字符串的條目的數組纔會被返回。如何使用一個數組作爲另一個數組的謂詞?
這可能嗎?下面
UPDATE
的答案是偉大的。我相信我需要舉一個真實的例子來驗證我所做的事情是否有意義。 (我仍然給下面的壓縮版本)
現在clientItems將類型FTRecord(核心數據)的
@interface FTRecord : NSManagedObject
...
@property (nonatomic) NSTimeInterval recordDate;
@end
@implementation FTRecord
...
@dynamic recordDate;
@end
下面這個類是從一個REST服務解析JSON的支架。因此,我們前面提到的serverItems將是這種類型的。
@interface FTjsonRecord : NSObject <JSONSerializable>
{
}
@property (nonatomic) NSDate *recordDate;
@implementation FTjsonRecord
- (NSUInteger)hash
{
return [[self recordDate] hash];
}
- (BOOL)isEqual:(id)object
{
if ([object isKindOfClass:[FTjsonRecord self]]) {
FTjsonRecord *other = object;
return [[self recordDate] isEqualToDate:[other recordDate]];
}
else if ([object isKindOfClass:[FTRecord self]]) {
FTRecord *other = object;
return [[self recordDate] isEqualToDate:[NSDate dateWithTimeIntervalSinceReferenceDate:[other recordDate]]];
}
else {
return NO;
}
}
與Wain的例子一起,這似乎工作正常。現在可行嗎? 請記住,serverItems只是臨時的,僅用於與服務器同步,並將被丟棄。 clientItems是一個仍然存在的地方。
更新2:
這一次,我想馬努的解決方案:
我建立了我的客戶DBStore,這是由謂詞調用此方法。 我不能使用containsObject
的原因是因爲serverItems和clientItems中的類類型不是同一類型。
-(BOOL)recordExistsForDate:(NSDate *)date
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recordDate == %@", date];
NSArray *arr = [allRecords filteredArrayUsingPredicate:predicate];
if (arr && [arr count] > 0) {
return YES;
} else {
return NO;
}
}
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(FTjsonRecord *evaluatedObject, NSDictionary *bindings) {
return ![store recordExistsForDate:[evaluatedObject recordDate]];
}];
NSSet *set = [[serverRecords items] filteredSetUsingPredicate:predicate];
我擔心這個解決方案雖然是從我clientItems(allRecords)讀取線性。我不確定它是如何有效地使用數組上的謂詞,想知道是否有更好的方法來實現這一點。
你看着使用'NSSet'而不是謂詞? – Wain
你能舉個例子嗎? – Houman