06 CTPersistance

이 라 이브 러 리 는 Casa 선생님 이 [에서] 이 글 (http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html) 에서 지속 적 인 방안 의 실현 을 제시 합 니 다. Key Value 의 간단 한 저장 보다 이 라 이브 러 리 는 SQLite 를 바탕 으로 약 한 업무 (데이터 조작) 패 키 징 을 제공 합 니 다.상태 있 는 데이터 의 지속 화 에 매우 적합 하 다.나 는 지난달 에 몇 가지 key value 의 지속 화 방식 을 조 사 했 고 이 방안 도 다시 보 았 다.키 - value 저장 만 필요 한 응용 프로그램 에 있어 서 이 지구 화 방안 은 좀 무 거 워 보 입 니 다.나 도 소스 코드 를 대충 두 번 이나 봤 는데 구체 적 으로 정리 하지 못 했다.가장 효과 적 인 학습 방식 은 역시 원본 코드 를 사용 하고 수정 하 는 것 이다.
이 방안 에서 강 한 업무 약 업무 의 분리, 데이터 표현 과 데이터 조작 의 분리 에 대해 잘 알 지만 프로젝트 에 사용 되 지 않 으 면 특별한 소감 이 없다.앞으로 도 이곳 으로 돌아 올 것 이 고, 다음은 정력 방안 단원 테스트 와 네트워크 의 프로젝트 내용 을 살 펴 볼 것 이다.
저 는 작가 Tian Wei Yu (AKA: Casa Taloyum) 가 롤 모델 이 라 고 생각 합 니 다.기술 도 좋 고 글 도 잘 쓰 고 열정 적 이 며 기본적으로 문답 이 있 고 그의 블 로그 에는 항상 답장 목록 이 있다.이 경박 한 기술 계 에 서 는 정말 보기 드물다.나 는 그의 iOS 응용 구조 담 몇 편의 글 을 통독 하여 많은 이익 을 얻 었 으 니 잘 연구 할 필요 가 있다.
문제.
1) CTPersistance Table 의 isFromMigration 속성 은 어떻게 사용 합 니까? 데이터 베 이 스 를 이전 할 때 무엇 을 주의해 야 합 니까?
2) CTPersistance Query Command. m line 72 들 어 오 는 error 가 nil 이면 함수 호출 에 실 패 했 습 니 다. NO 가 아 닌 YES 로 돌아 갑 니 다.
총결산
1) 버 전 이전 절 차 는 데이터베이스 대상 을 만 들 때 이전 여 부 를 판단 하고 이전 을 실행 합 니 다.구체 적 으로 는 CTPersistanceDataBase - (instancetype)initWithDatabaseName:(NSString *)databaseName error:(NSError *__autoreleasing *)error 。데이터베이스 에 CTPersistance Versiontable 이라는 표 가 있 는데 현재 데이터베이스 버 전 을 기록 합 니 다.표 는 두 개의 필드 만 있 고 한 개의 기록 만 있다.표 에 기록 이 없 으 면 CTPersistance Migrator 의 migration Versionlist 첫 번 째 기록 으로 초기 화 합 니 다.+ (NSDictionary *)columnInfo{ return @{ @"identifier":@"INTEGER PRIMARY KEY AUTOINCREMENT", @"databaseVersion":@"TEXT" }; }
하나의 데이터 베 이 스 는 Migrator, Migrator 의 migrationVersionlist 에 대응 하여 데이터 베 이 스 를 이전 하 는 모든 버 전 을 기록 합 니 다.각 버 전 은 CTPersistance Migration Step 프로 토 콜 을 준수 하 는 Migration Step 클래스 에 대응 합 니 다. 이 클래스 는 해당 버 전의 위로, 아래로 이동 하 는 방법 을 제공 합 니 다.@implementation TestMigrator#pragma mark - CTPersistanceMigratorProtocol- (NSDictionary *)migrationStepDictionary{ return @{ @"1.0":[MigrationStep1_0 class], @"2.0":[MigrationStep2_0 class] };} - (NSArray *)migrationVersionList{ return @[kCTPersistanceInitVersion, @"1.0", @"2.0"]; } @end @implementation MigrationStep1_0- (void)goUpWithQueryCommand:(CTPersistanceQueryCommand *)queryCommand error:(NSError *__autoreleasing *)error{ TestTable *testTable = [[TestTable alloc] initWithQueryCommand:queryCommand]; [[queryCommand addColumn:@"migration1_0" columnInfo:@"TEXT" tableName:testTable.tableName] executeWithError:error]; [testTable findWithPrimaryKey:@(1) error:NULL]; } - (void)goDownWithQueryCommand:(CTPersistanceQueryCommand *)queryCommand error:(NSError *__autoreleasing *)error { } @end
지식 점
1) #define NSDictionaryOfVariableBindings(...) _NSDictionaryOfVariableBindings(@"" # __VA_ARGS__, __VA_ARGS__, nil) UIKIT_EXTERN NSDictionary *_NSDictionaryOfVariableBindings(NSString *commaSeparatedKeysString, __nullable id firstValue, ...) NS_AVAILABLE_IOS(6_0); // not for direct use NSString *name = @"wenjing"; NSNumber *age = @31; NSDictionary *dic = NSDictionaryOfVariableBindings(name, age); (lldb) po dic { age = 31; name = wenjing; }
nice code sample
1) 간단 한 스 레 드 간 동기 화 메커니즘 (성능 이 높 지 않 을 것 입 니 다. 특히 메 인 스 레 드 에서 실행 할 수 없습니다)- (void)performAsyncAction:(void (^)(void))action shouldWaitUntilDone:(BOOL)shouldWaitUntilDone { __block volatile BOOL shouldWait = shouldWaitUntilDone; NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ action(); shouldWait = NO; }]; [self.operationQueue addOperation:operation]; while (shouldWait) { } }
2) sqlite C 언어 인터페이스 사용 사례
3) 클래스 가 기본 클래스 에서 빈 방법 을 사용 하지 않 고 프로 토 콜 을 준수 하도록 합 니 다 @ interface CTPersistance Table () @ property (nonatomic, weak) id child; @property (nonatomic, strong, readwrite) CTPersistanceQueryCommand *queryCommand; @end 여 기 는 왜 self 를 직접 사용 하 는 것 이 아니 라 child 를 원 합 니까?

좋은 웹페이지 즐겨찾기