
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ã®çŽ¹ä»