06 CTPersistance
이 방안 에서 강 한 업무 약 업무 의 분리, 데이터 표현 과 데이터 조작 의 분리 에 대해 잘 알 지만 프로젝트 에 사용 되 지 않 으 면 특별한 소감 이 없다.앞으로 도 이곳 으로 돌아 올 것 이 고, 다음은 정력 방안 단원 테스트 와 네트워크 의 프로젝트 내용 을 살 펴 볼 것 이다.
저 는 작가 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 를 원 합 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.