iOS - 빠른 필터링, 정리 및 계산

5253 단어

디렉토리:


-NSPredicate -NSSortDescriptor -KVC

NSPredicate

NSPredicate이라는 종류는 많은 사람들이 낯설다.이것은 애플이 제공하는 빠른 선별 대상 데이터의 필터로 강력하면서도 간결하다.CoreData에서 뚜렷하게 드러난다.
키워드AND OR 이러한 해석은 = > < >= <= == != BETWEEN {x,y}IN{x,.....}: 모호한 조회 2.MATCHES: 문자열 3.LIKE: 문자열 시작 4.CONTAINS: 문자열 끝 5.BEGINSWITH: 문자열 자체로 문자열 그룹에 사용됩니다.
구문 형식
대상 필드 일치 키워드 일치 필드: ENDSWITH 여러 일치 AND OR 추가 가능 기본적으로 sql: SELF
//  
Food {
name,
monry
}
@property (copy, nonatomic)NSArray *sources;

예를 들어 나는 대상(age == 123)의 수조에서 변수의 이름이 name == 'xxx' AND age == 123이고 그 값이 Food인 대상을 선별하려고 한다.이전 방식:
NSMutableArray *foods = [@[] mutableCopy];
for (Food *food in self.sources) {
    if ([food.name isEqualToString:@" "]) {
        [arrayM addObject:food];
    }
}

현재 방식:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@" "];
NSArray *foods = [self.sources filteredArrayUsingPredicate:predicate];

갑자기 높아졌다는 걸 알게 될 거야.Y(_)Y 물론 이것들은 비교적 기초적인...
일반적으로 사용되는 기능:
//    [cd]: , [cd] 
// *: sql %
NSString * searchText = @"xxx";
//NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@",[NSString stringWithFormat:@"*%@*",searchText]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",searchText];// 
NSArray *searchFoods = [self.sources filteredArrayUsingPredicate:predicate];

//BETWEEN{x,y}
NSPredicate *between = [NSPredicate predicateWithFormat:@"monry BETWEEN{10,100}"];
NSArray *betweenFoods = [self.sources filteredArrayUsingPredicate: between];

//IN{x,.....}
NSPredicate *inPred = [NSPredicate predicateWithFormat:@"name IN{%@,%@}",@"xx",@"xxxx"];
NSArray * inPredFoods = [self.sources filteredArrayUsingPredicate: inPred];

//MATCHES  
NSString *regex =@"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";// 
NSPredicate *regexTestMobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL isPhone = [regexTestMobile evaluateWithObject:@"13111111111"];


NSSortDescriptor(정렬)


서열에 있어서는 낡은 방법을 쓰지 않겠다.(게으름*\(o)/*)
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"monry" ascending:YES];
NSArray *foods = [self.sources sortedArrayUsingDescriptors:@[sortDescriptor]];
/*
// , , 
[self.sources sortUsingComparator:^NSComparisonResult(Food * _Nonnull obj1, Food *_Nonnull obj2) {
    return !sender.selectedSegmentIndex?[obj1.monry compare:obj2.monry]:[obj2.monry compare:obj1.monry];
}];
*/

물론 이것은 단순 정렬일 뿐이다.복잡하게 스스로 논리를 써야 할 때도 name 또는 에서 제공한 방법을 사용할 수 있다.
@interface NSArray (NSExtendedArray)
...
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void * __nullable))comparator context:(nullable void *)context;
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void * __nullable))comparator context:(nullable void *)context hint:(nullable NSData *)hint;
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator;
...
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
- (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
@end
@interface NSMutableArray (NSExtendedMutableArray)
...
- (void)sortUsingFunction:(NSInteger (*)(ObjectType,  ObjectType, void * __nullable))compare context:(nullable void *)context;
- (void)sortUsingSelector:(SEL)comparator;
...
- (void)sortUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
- (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
@end

또 어떤 곳은 글자 수를 차지하지 않으니 스스로 찾아라.

KVC를 사용한 컴퓨팅


키워드NSArray: 최소값 NSSet: 최대값 @min: 평균값 @max: 합계
기초 연산
NSInteger min = [[self.sources valueForKeyPath:@"@min.monry"] integerValue];
NSInteger max = [[self.sources valueForKeyPath:@"@max.monry"] integerValue] ;
NSInteger sum =[[self.sources valueForKeyPath:@"@sum.monry"] integerValue];
double avg = [[self.sources valueForKeyPath:@"@avg.monry"] doubleValue] ;

사용한 순간 세상이 많이 좋아진 것 같아요.

요약:


물론 이것들은 모두 프로젝트 안의 논리적 수요를 보고 어떻게 개인과 어울리는지 보는 것이다(☆ ☆).가장 간단한 실전 경험: 나는 현지에서 읽지 않은 메시지의 총계를 계산해서 Tabbar Badge에 표시하거나 App Icon Badge에 표시하고 싶다.
논리: NSPredicate를 사용하여 읽지 않은 메시지 세션을 필터링한 다음 @sum.count, 최종 할당.물론 수요도 보아야 한다. 그리고 네가 논리를 실현하는 것은 네 계산에 달려 있다.
DEMO
마지막으로 어떤 글이 틀렸는지 댓글로 토로해 주시고 함께 공부하는 분들을 환영합니다.

좋은 웹페이지 즐겨찾기