
iOS 9ã§ãAppleã¯ãµãŒãããŒãã£ã¢ããªã®ã¹ãããã©ã€ãæ€çŽ¢ã远å ããŸããã ããã¯ãåãçš®é¡ã®ã³ã³ãã³ãïŒãã¥ãŒã¹ã¢ããªã±ãŒã·ã§ã³ãé»åã¡ãŒã«ã¯ã©ã€ã¢ã³ããã€ãã³ããã¹ã¿ãŒïŒãæã€ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ãã RamblerïŒCoã®iOSéçºéšéã¯ããã§ã«äžéšã®ã¢ããªã±ãŒã·ã§ã³ã«æ€çŽ¢æ©èœãçµ±åããŠããŸãã
ãã®èšäºã§ã¯ã
CoreSpotlightã®æ¢åãããžã§ã¯ããžã®çµ±åã«ã€ããŠ
説æããçºçããåé¡ãšãã®è§£æ±ºçã«ã€ããŠèª¬æããŸãã
Search API
ãŸããçŸåšã®æ©èœãšãã®ã¢ããªã±ãŒã·ã§ã³ã®å Žæã®å
šäœåã瀺ãããã«ããµãŒãããŒãã£ã¢ããªã±ãŒã·ã§ã³ã§ã³ã³ãã³ããæ€çŽ¢ããããã®æ©èœãiOS 9ã§çŸåšå©çšå¯èœã§ããããšãæç¢ºã«ãã䟡å€ããããŸãã
çŸåšãSearch APIã¯æ¬¡ã®ã³ã³ããŒãã³ãã§æ§æãããŠããŸãã
NSUserActivity- 衚瀺ãããã³ã³ãã³ããšãŠãŒã¶ãŒã¢ã¯ãã£ããã£ãä¿åããã³
埩å
ããã¯ã©ã¹ã ãã®ã¯ã©ã¹ã¯ã
ãã³ããªã ïŒå¥ã®ããã€ã¹äžã®åãã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ãç¶ç¶ããæ©èœïŒãå®è£
ããããã«iOS 8ã§å°å
¥ãããŸããã iOS 9ã§ã¯ããã®ã¯ã©ã¹ã¯æ€çŽ¢çµæããã¢ããªã±ãŒã·ã§ã³ãéããšãã«ã䜿çšãããŸãã 以äžãå«ãã¢ãã«ã§ãã
- ã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ
ã埩å
ããããã®æ
å ±ã
- ãã®æ
å ±ãšããåãããæ¹æ³ã®èª¬æã
- ãã®æ
å ±ãã·ã¹ãã ã«ä¿åããæ¹æ³ã
ãã®ã¢ã¯ãã£ããã£ãå
¬éããããšãã§ããŸããã€ãŸãããã®ã¢ã¯ãã£ããã£ã¯ãã®ããã€ã¹ã®æ€çŽ¢çµæã ãã§ãªããä»ã®ãŠãŒã¶ãŒã«ã衚瀺ãããŸãã ãã®æ©èœãæ©èœããã®ã¯æ°ãæä»¥å
ã«éå§ãããããšã«æ³šæããŠãã ããã
CoreSpotlightã¯ãéçºè
ã
ã¢ããªã±ãŒã·ã§ã³ã³ã³ãã³ãã«
ã€ã³ããã¯ã¹ã
ä»ããŠã
åŸã§Spotlightæ€çŽ¢çµæã«è¡šç€ºã§ããããã«ãããã¬ãŒã ã¯ãŒã¯ã§ãã æ¬¡ã®2ã€ã®ã¢ãã«ããããŸãã
- æ€çŽ¢ã«è¡šç€ºãã屿§ã
- ã³ã³ãã³ããèå¥ããããã®ããããã£ã
CoreSpotlightã«ã¯ãæ€çŽ¢ãããªããžã§ã¯ãã远å ããã³åé€ããããã®ã¡ãœãããå«ãŸããŠããŸãã
WebããŒã¯ã¢ããã¯ãAppleãããã
ãµã€ãã³ã³ãã³ã ïŒç¹å¥ãªã¡ã¿ã¿ã°ïŒã®
ã€ã³ããã¯ã¹ã
äœæããŠãã¢ããªã±ãŒã·ã§ã³ã§ã®æ€çŽ¢ãšãªãŒãã³ã®çµæãšããŠè¡šç€ºã§ããããã«ããæè¡ã§ãã
WebããŒã¯ã¢ãããšNSUserActivityã®è©³çްã«ã€ããŠã¯ãWWDC 2015ãããã¥ã¡ã³ããããã³èšäºã®æåŸã«ãããªã³ã¯ãåç
§ããŠãã ããã
åé¡ã®å£°æ
äŸãšããŠã
Rambler.Mailã¢ããªã±ãŒã·ã§ã³
ã䜿çšãã
CoreSpotlightçµ±å
ãèŠãŠãããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ãããŒã¿ããŒã¹ïŒCoreDataïŒã«ä¿åãããŠãããã©ã«ããŒãã¬ã¿ãŒãæ·»ä»ãã¡ã€ã«ãé£çµ¡å
ã®æ€çŽ¢ã远å ããŸãã æŽæ°æãŸã§ã«ããã®ããŒã¿ããŒã¹ã¯ãã§ã«ãã£ã±ãã«ãªã£ãŠããŸãã ããã«åºã¥ããŠãæåã®èŠä»¶ã¯ã
ä¿åãããŠãããã¹ãŠã®ããŒã¿ã®ãã©ã€ããªã€ã³ããã¯ã¹ã§ã ã
ãããã®ãªããžã§ã¯ãã¯ãã¹ãŠäœæãåé€ãããã³å€æŽã§ãããã
ãã¡ã€ã³ããŒã¿ããŒã¹ãšã€ã³ããã¯ã¹ä»ããªããžã§ã¯ãã®æŽåæ§ãç¶æããå¿
èŠããã
ãŸã ã å€ãã®ããŒã¿å€æŽæäœããããããããäºãã«ãªãŒããŒã©ããããå¯èœæ§ããããããã·ã¹ãã
ã¯å€æŽã»ãããåŠçããããã«å®è£
ããå¿
èŠã
ãããŸããäžèšã®èŠä»¶ã«åºã¥ããŠã
ã€ã³ããã¯ã¹äœæã®ããã®æäœã®æ°ã
ãçž®å°ãããå¿
èŠããããŸãã åããªããžã§ã¯ãã«è€æ°ã®å€æŽãå ããå Žåã1åã®æŽæ°æäœã®ã¿ãåŠçããã°ååã§ãã ãªããžã§ã¯ããåé€ããå Žåããã®ãªããžã§ã¯ãã«ãã§ã«ååšãã倿Žã®ã€ã³ããã¯ã¹ä»ãã®èŠæ±ãåŠçããããšã¯æå³ããããŸããã
å°æ¥çã«ã¯ãä»ã®ãããžã§ã¯ããžã®çµ±åãèšç»ãããŠãããããã€ã³ããã¯ã¹ä»ãã·ã¹ãã
ã¯å¯èœãªéãç¬ç«ããããããçš®é¡ã®ãªããžã§ã¯ãã«ã€ã³ããã¯ã¹ãä»ããããšãã§ã ã
ç°¡åã«çµ±åã倿Žãæ¡åŒµããå¿
èŠããããŸãã
ã€ã³ããã¯ã¹äœæã«ã¯æéããããïŒç¹ã«ãã©ã€ããªïŒãäžæãããå¯èœæ§ãããããããã®ç¶æ
ãä¿åããå¿
èŠããããŸãã ã€ãŸãã
æªåŠçã®å€æŽããã¹ãŠä¿åã ãã¢ããªã±ãŒã·ã§ã³ã®åèµ·åæã«ã€ã³ããã¯ã¹äœæãéå§ããå¿
èŠããããŸãã åæã«ã
ããŒã¿ããŒã¹ãžã®åŒã³åºãã®æ°ã
æå°éã«æããããã«ã·ã¹ãã ãå®è£
ããå¿
èŠãããã倿Žãä¿åããããã®è£å©ãªããžã§ã¯ãã®æ°ã¯ã倿Žããããªããžã§ã¯ãã®æ°ãããå°ãªãã£ãã
æ§é
ã¿ã¹ã¯ãèšå®ããåŸãã·ã¹ãã ãããã€ãã®ã¢ãžã¥ãŒã«ã«åå²ããåã¢ãžã¥ãŒã«ãæ©èœã¿ã¹ã¯ã®1ã€ãæ
åœããŸãã åæã«ãã€ã³ããã¯ã¹ä»ããªããžã§ã¯ããæäœããã¢ãžã¥ãŒã«ã¯ãããã³ã«ã«ãã£ãŠéãããããããå¿
èŠã«å¿ããŠã¢ãžã¥ãŒã«ã®ç¬èªã®å®è£
ãèšè¿°ã§ããã·ã¹ãã ã¯åŒãç¶ãåäœããŸãã
ããŒã¿ãœãŒã¹ã¯
<ChangeProvider>ã§ãã ãã®ãããã³ã«ãå®è£
ããã¯ã©ã¹
ã¯ããªããžã§ã¯ã
ãžã®å€æŽã«é¢ããæ
å ±ãã¢ãã¿ãŒã«æäŸããŸãã ã€ã³ããã¯ã¹ãäœæããå¿
èŠãããåãšã³ãã£ãã£ã«ã¯ãç¬èªã®ãããã€ããŒãå¿
èŠã§ãã 䟿å®äžãNSFetchedResultsControllerã«ãã£ãŠåæåãããããªã²ãŒããšããŠããèªäœãå
¬éããIndexerMonitorã®å€æŽã«é¢ãããã¹ãŠã®ã€ãã³ãããããã·ããåºæ¬ã¯ã©ã¹ãå®è£
ãããŸãïŒããã«ã€ããŠã¯åŸã§èª¬æããŸãïŒã
@protocol RamblerChangeProvider <NSObject> @property (weak, nonatomic) id<RamblerChangeProviderDelegate> delegate; @end
@protocol RamblerChangeProviderDelegate <NSObject> - (void)changeProvider:(id<RamblerChangeProvider>)changeProvider didChangeObject:(id)object changeType:(RamblerChangeType)changeType; - (void)processChanges; - (NSArray *)obtainObjectsForInitialIndexing; @end
@interface RamblerFetchedResultsControllerChangeProvider : NSObject <RamblerChangeProvider> + (instancetype)changeProviderWithFetchedResultsController:(NSFetchedResultsController *)controller; @end
ã€ã³ãã¯ãµãŒã¯
<Indexer>ã§ãã ããŒã¿ããŒã¹ããã®
ããŒã¿ã®ã€ã³ããã¯ã¹äœæã«é¢äžããŠãããªããžã§ã¯ãã®ãããã³ã«ã ã€ã³ããã¯ã¹ãäœæããå¿
èŠããããšã³ãã£ãã£ããšã«ãç¬èªã®ã€ã³ãã¯ãµãŒãªããžã§ã¯ãã远å ãããŸãã 圌ã¯ãäžé£ã®å€æŽãåŠçããèªåã«æž¡ããããªããžã§ã¯ããšãªããžã§ã¯ããèå¥åã§äžæã«èå¥ããæ¹æ³ãç¥ã£ãŠããŸãã 䟿å®äžãåºæ¬ã¯ã©ã¹ãå®è£
ãããŠãããããããç¶æ¿ããå¿
èŠããããŸãã ã€ã³ãã¯ãµãŒã¯ãããåŠçæäœãäœæããã¢ãã¿ãŒã«è¿ããŸãã
@protocol RamblerIndexer <NSObject> - (NSOperation *)operationForIndexBatch:(RamblerIndexTransactionBatch *)batch withCompletionBlock:(RamblerErrorBlock)block; - (BOOL)canIndexObjectWithIdentifier:(NSString *)identifier; - (NSString *)identifierForObject:(id)object; - (id)objectForIdentifier:(NSString *)object; @end
@interface RamblerIndexerBase : NSObject <RamblerIndexer> @property (strong, nonatomic) CSSearchableIndex *searchableIndex; - (CSSearchableItem *)searchableItemForObject:(id)object; - (BOOL)canIndexObjectWithType:(NSString *)objectType; @end
åäœããã«ã¯ãRamblerIndexerBaseã®2ã€ã®ã¡ãœãããšRamblerIndexerãããã³ã«ã®æåŸã®3ã€ã®ã¡ãœããããªãŒããŒã©ã€ãããå¿
èŠããããŸãã
èå¥åãžã§ãã¬ãŒã¿ãŒ -IndexIdentifierFormatter-ãœãŒã¹ãªããžã§ã¯ããæ€çŽ¢ããããã«ã
èå¥åã
çæããŠãéèŠãªéšåãïŒå埩ã«å¿
èŠãªæååã®éšåïŒã«
åå²ããããã®è£å©ãªããžã§ã¯ãã ããšãã°ãã¬ã¿ãŒã®èå¥åã¯ã
RCMMessage_129_Inbox ãã®ããã«ãªããŸãã
ãRCMMessageã -ãªããžã§ã¯ãã¿ã€ããã
129 ã-ãã©ã«ããŒå
ã®ã¬ã¿ãŒã®èå¥åããInboxã-ã¡ãã»ãŒãžãé
眮ãããŠãããã©ã«ããŒã®ååã ãã®æ
å ±ã«åºã¥ããŠããªããžã§ã¯ãã®ã¿ã€ããäžæã«æ±ºå®ããŠèŠã€ããããšãã§ããŸãã
@protocol RamblerIndexIdentifierFormatter <NSObject> - (NSString *)identifierForObject:(id)object; - (BOOL)isCorrectIdentifier:(NSString *)identifier; @end
@interface RamblerMessageIndexIdentifierFormatter : NSObject - (NSNumber *)messageUIDFromIdentifier:(NSString *)identifier; - (NSString *)folderNameFromIdentifier:(NSString *)identifier; @end
ã¹ãã¢ã® å€æŽ -StateStorage-åŸç¶ã®åŠçã®ããã«
倿Žã
ä¿åããã¢ãžã¥ãŒã«ã 圌ã¯ã倿Žã®ã¿ã€ãã倿Žããããªããžã§ã¯ãã®ã¿ã€ããããã³ãã®èå¥åãæ ŒçŽãããã©ã³ã¶ã¯ã·ã§ã³ãåãåãããããããŒã¿ããŒã¹ã«ä¿åããŸãã ã€ã³ããã¯ã¹ä»ããªããžã§ã¯ãã®ã¿ã€ãããšã«ããã®ããŒã¿ããŒã¹ã«ã¯1ã€ã®ã¬ã³ãŒãããããŸãã åãªããžã§ã¯ãã«ã¯ãããŸããŸãªã¿ã€ãã®å€æŽã®èå¥åã®OrderSetãå«ãŸããŠããŸãã ããã¯ãããã¿ã€ãã®ãªããžã§ã¯ã倿Žã®èå¥åãç¹°ãè¿ãããªãããã«ããããã«å¿
èŠã§ãã
@interface RamblerIndexerStateStorage : NSObject - (void)insertTransaction:(RamblerIndexTransaction *)transaction; - (void)insertTransactionsArray:(NSArray<NSArray *> *)transactionsArray changeType:(RamblerChangeType)changeType; - (RamblerIndexTransactionBatch *)obtainTransactionBatch; - (void)removeProcessedBatch:(RamblerIndexTransactionBatch *)batch - (BOOL)shouldPerformInitialIndexing; @end
ã·ã¹ãã ã®ã³ã¢ïŒã¢ãã¿ãŒïŒ -IndexerMonitor-ãã®ã¢ãžã¥ãŒã«
ã¯ãã·ã¹ãã ã®ä»ã®ãã¹ãŠã®éšåãæ¥ç¶ããŸã ã ã¢ãã¿ãŒã«ã¯ä»¥äžãå«ãŸããŸãã
- åã¿ã€ãã®ãªããžã§ã¯ãã®ã€ã³ãã¯ãµãŒãšãããã€ããŒã®ã»ããã
- ãããã€ããŒããã®å€æŽãä¿åããStateStorageã
- æäœãäžé£ã®å€æŽã®ã€ã³ããã¯ã¹ãäœæãããã¥ãŒã
- CSSearchableIndexãããã³ãã®ããªã²ãŒããšããŠæ©èœããŸãã
@interface RamblerIndexerMonitor : NSObject - (void)startMonitor; - (void)stopMonitor; - (void)addIndexer:(id<RamblerIndexer>)indexer withChangeProvider:(id<RamblerChangeProvider>)changeProvider; @end
äœæ¥ã¢ã«ãŽãªãºã

ããã»ã¹å
šäœã2ã€ã®è«çæéã«åããããšãã§ããŸãã
- 倿Žã®ä¿å -ãã®æ®µéã§ã倿Žã«é¢ããã€ãã³ããåéãããããŒã¿ããŒã¹ã«ä¿åãããŸãã ãã®æéã®æ®µéã¯ãå³äžã§èµ€ãããŒã«ãŒã§ããŒã¯ãããŠããŸãã
- 倿Žã®çŽ¢åŒä»ã - 倿Žã»ãããååŸããŠçŽ¢åŒä»ãããŸãã æéã®æ®µéã¯çŽ«è²ã®ããŒã«ãŒã§ããŒã¯ãããŠããŸãã
倿Žãä¿åããæé ïŒ
- NSFetchedResultsControllerã¯ãããªã²ãŒãã¡ãœããã䜿çšããŠããœãŒã¹ããŒã¿ããŒã¹å
ã®ãªããžã§ã¯ãã®å€æŽã«ã€ããŠãããã€ããŒïŒ<ChangeProvider>ïŒã«éç¥ããŸãã
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(NSManagedObject *)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath;
- ãããã€ããŒã¯ãã¢ãã¿ãŒäžã®ããªã²ãŒãã¡ãœãããåŒã³åºããŸããããªã²ãŒãã¡ãœããã§ã¯ããããã€ããŒèªäœããªããžã§ã¯ããããã³å€æŽã®çš®é¡ãæž¡ããŸãã
- (void)changeProvider:(id<RamblerChangeProvider>)changeProvider didChangeObject:(id)object changeType:(RamblerChangeType)changeType;
- ã¢ãã¿ãŒã¯ããããã€ããŒã«ãã£ãŠé¢é£ä»ããããã€ã³ãã¯ãµãŒãå€å¥ãããã®ãªããžã§ã¯ãã®èå¥åãèŠæ±ããŸãã ã€ã³ãã¯ãµãŒã¯ããã®ããã«IndexIdentifierFormatterã䜿çšããŸãã æ¬¡ã«ãã¢ãã¿ãŒã¯èå¥åãšå€æŽã®çš®é¡ãããã©ã³ã¶ã¯ã·ã§ã³ãçæãããããStateStorageã«æž¡ããŸãã
- StateStorageã¯ãçŸåšã®ã¿ã€ãã®ãªããžã§ã¯ãã®IndexStateïŒNSManagedObjectïŒãèŠæ±ãŸãã¯äœæãããã®OrderSetïŒinsertIdentifiersãupdateIdentifiersãdeleteIdentifiersïŒãåããŸãã 倿Žã®é¢é£æ§ã倿ããããã«å¿
èŠãªå€æŽæ¥ãèšå®ããŸãã ãããŠã倿ŽãããŒã¿ããŒã¹ã«æžã蟌ã¿ãŸãã
ã€ã³ããã¯ã¹äœæã®å€æŽæé ïŒ
- ããšãã°ãã€ã³ãã¯ãµãŒã®ããªã²ãŒãã¡ãœããã®åŒã³åºããç£èŠã®éå§ãããã¯ã°ã©ãŠã³ãã®çµäºãªã©ã®ç¹å®ã®ã€ãã³ãã«ãã£ãŠãã¢ãã¿ãŒã¯ãçŸåšå®è¡ãããŠããªãå Žåã¯ã€ã³ããã¯ã¹äœæãéå§ããå¿
èŠãããããšãèªèããŸãã
- ã¢ãã¿ãŒã¯ãStateStorageã«ã1çš®é¡ã®ãªããžã§ã¯ãïŒIndexStateããäœæïŒã®å€æŽã®ã¿ãå«ãIndexTransactionBatchãªããžã§ã¯ãã®åœ¢åŒã§äžé£ã®å€æŽãèŠæ±ããŸãã
- ã¡ãœããã䜿çšããŠç£èŠãã
- (BOOL)canIndexObjectWithType:(NSString *)objectType
ç¹å®ã®ã¿ã€ãã®ãªããžã§ã¯ãã§äžé£ã®å€æŽãåŠçã§ããæåã®ã€ã³ãã¯ãµãŒãèŠã€ãããã®ã»ããã«æž¡ããŠã€ã³ããã¯ã¹äœææäœãäœæããŸãã
- ã€ã³ãã¯ãµãŒã¯æäœãäœæããã¢ãã¿ãŒã«è¿ããŸãã
- ã¢ãã¿ãŒã¯ãæäœãåŠçãã¥ãŒã«è¿œå ããŸãã æäœå®äºãããã¯ãåŒã³åºããããšãã€ã³ããã¯ã¹äœæãæåãããšãããããStateStorageã«æž¡ãããããŒã¿ããŒã¹ããåŠçããããã¹ãŠã®èå¥åãåé€ãããŸãã ãã®åŸã次ã®å€æŽãåŠçã§ããŸãã
æäœïŒ
- insertIdentifiersãšupdateIdentifiersãçµã¿åãããŠãäžæã®èå¥åã®ã¿ãæ®ãããã®åŸãçµæã®OrderSetããdeleteIdentifiersããèå¥åãåé€ããŸãã
- ã€ã³ããã¯ã¹äœæã®ããã«ã€ã³ããã¯ã¹ä»ããªããžã§ã¯ãã®ã€ã³ãã¯ãµãŒãç
§äŒããŸãã
- çµæã®ãªããžã§ã¯ãã«å¯ŸããŠãCSSearchableItem'ovã®é
åãèŠæ±ããCSSearchableIndexã«ã€ã³ããã¯ã¹ãä»ããããã«ããããæäŸããŸãã
- å®äºããããdeleteIdentifiersãæ€çŽ¢çµæããåé€ããããã«CSSearchableIndexã«æž¡ããŸãã
- ãã®åŸãå®äºãããã¯ãåŒã³åºãããã¡ãœããã«æž¡ãããŸãã
äžæ¬¡çŽ¢åŒä»ã
ã·ã¹ãã ã®æåã®èµ·åæã«ãã¢ãã¿ãŒã¯StateIndexã«ãã©ã€ããªã€ã³ããã¯ã¹åãå®è¡ããããã©ãããå°ããŸãã StateStorageã¯ãå°ãªããšã1ã€ã®IndexStateãååšãããã©ããã確èªããŸãã ã¬ã³ãŒããååšããªãå Žåããã©ã€ããªã€ã³ããã¯ã¹ã¯ãŸã çºçããŠããŸããã ã¢ãã¿ãŒã¯ãã¹ãŠã®ãããã€ããŒã«ãã©ã€ããªã€ã³ããã¯ã¹ã®ãªããžã§ã¯ãã®ãªã¹ããèŠæ±ããããããããã©ã³ã¶ã¯ã·ã§ã³é
åã®é
åïŒãªããžã§ã¯ãã®çš®é¡ããšã«1ã€ã®é
åïŒãäœæããŸãã ãããã¯ãã¹ãŠãStateStorageã®ã¹ãã¬ãŒãžã«è»¢éãããŸãã
StateStorageã¯ãããããã¹ãŠã®å€æŽã1ã€ã®performBlockAndWaitã«ä¿åããŸããããã«ãããååæ§ãä¿èšŒãããŸãã ãã®çµæããã¹ãŠã®å€æŽãä¿åãããããåäžã®å€æŽãä¿åãããªãå ŽåïŒã¢ããªã±ãŒã·ã§ã³ããªãã«ãªã£ãŠããå ŽåïŒããã®å Žåã¯ãã©ã€ããªã€ã³ããã¯ã¹ãå床å®è¡ãããŸãã
ãŸãšã
ä»»æã®ã¿ã€ãã®ãªããžã§ã¯ãã«ã€ã³ããã¯ã¹ãä»ããããã«ç°¡åã«æ¡åŒµããã³çµ±åã§ããèšäºã®åé ã§èšå®ããä»ã®ãã¹ãŠã®èŠä»¶ãæºããã·ã¹ãã ãæã«å
¥ããŸããã
çµ±åã®ããã«ã¯ãRamblerIndexerBaseã¯ã©ã¹ã®åºæ¬æ©èœãç¶æ¿ããç¬èªã®ã€ã³ãã¯ãµãŒãããã€ãå®çŸ©ããå¿
èŠããããŸãããªããžã§ã¯ããããŒã¿ããŒã¹ã«ä¿åãããŠããªãå Žåã¯ãããã€ãã®ãããã€ããŒãå®çŸ©ããå¿
èŠããããŸãã ãã以å€ã®å Žåã¯ãRamblerFetchedResultsControllerChangeProviderã¯ã©ã¹ã䜿çšã§ããŸãã ãã®åŸãã·ã¹ãã å
šäœãæåãŸãã¯
Typhoonãªã©ã®DIãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠçµã¿ç«ãŠãããŸãã
ä»äºã®ããã€ãã®ç¹åŸŽïŒ
- ã¢ãã¿ãŒã¯CSSearchableIndexããªã²ãŒãã¡ãœãããåŠçããŠããªããžã§ã¯ãã®ã€ã³ããã¯ã¹ãåäœæããå¿
èŠããããŸãã iOSã«ã¯ãã€ã³ããã¯ã¹ä»ããªããžã§ã¯ãã®æ°ã«å¶éãããããšãç¥ã£ãŠããå¿
èŠããããŸãããããã¯ã10,000åã®ãªããžã§ã¯ããšãåèšã€ã³ããã¯ã¹ãµã€ãºã®çŽ130 MBã§ãã
- ã€ã³ããã¯ã¹äœæã¯ã1ã€ã®ã¹ã¬ããã§ã®ã¿åæã«è¡ãå¿
èŠããããŸã ã ãã®ããã æäœãã¥ãŒã䜿çšããŸã ã
- èå¥åã«ã¹ããŒã¹ã䜿çšããªãã§ãã ããã
- æ€çŽ¢çµæã®é¢é£æ§ãé«ããã«ã¯ãNSUserActivityãå®è£
ããCoreSpotlightå®è£
ãšåãèå¥åãšåã屿§ã䜿çšããå¿
èŠããããŸãã ããã«ã¯ããã§ã«æºåãããã€ã³ãã¯ãµãŒã䜿çšã§ããŸãã
- 5ã10åã®ããŒã¯ãŒãããå§ãããŸãã
ãã®èšäºã§ç޹ä»ããã·ã¹ãã ã¯ãŸããªã
GitHubã§å
¬éã
ã ãTwitter
Rambler.iOSã§å ±åãããã®èšäºãžã®ãªã³ã¯ã远å ããŸãã
æ€çŽ¢çµæãéãåŠçã«ã€ããŠã¯ã次ã®ããŒãã§èª¬æããŸãã ããã«ãã¢ããªã±ãŒã·ã§ã³ãèµ·åããããã®ããŸããŸãªãªãã·ã§ã³ã®ããžãã¯ã®å€æ§æ§ïŒããã·ã¥éç¥ãæ€çŽ¢çµæãããéåžžã®èµ·åïŒãéããšãã®å
¥åãã©ã¡ãŒã¿ãŒã®åŠçïŒéç¥ããã®userInfoãNSUserActivityïŒãç®çã®ç»é¢ã«ç§»åããæ¹æ³ãªã©ã®ãããã¯ãã«ããŒããŸãïŒäŸïŒè€æ°ã®ã¹ããŒãªãŒããŒããå«ãããã²ãŒã·ã§ã³ã¹ã¿ãã¯ãæåã§ååŸããïŒã
䟿å©ãªãªã³ã¯ïŒ
ããã¥ã¡ã³ãïŒ
iOS Search APIã®ãã¹ããã©ã¯ãã£ã¹ãšFAQã¢ããªæ€çŽ¢ããã°ã©ãã³ã°ã¬ã€ãNSUserActivityã¯ã©ã¹ãªãã¡ã¬ã³ã¹ã³ã¢ã¹ãããã©ã€ããã¬ãŒã ã¯ãŒã¯ãªãã¡ã¬ã³ã¹WWDC 2015ã®ãããªïŒ
WWDC 2015ã®æ€çŽ¢APIã®ç޹ä»ã¢ããªãžã®ã·ãŒã ã¬ã¹ãªãªã³ã¯ã³ãŒãäŸïŒ
WWDC 2015ïŒAndrésIbañezã«ããæ€çŽ¢APIã®ç޹ä»iOS 9ïŒDavis Allieã«ããæ€çŽ¢APIã®ç޹ä»