рд╕реАрд▓ рдХреЗ рдмрд┐рдирд╛ рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░



рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рдФрд░ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рд╡рд┐рддрд░рдг рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо iFunny рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд▓рдЧрд╛рддрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдШрдЯрд┐рдпрд╛ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рднреА рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣реЗ рддрддреНрд╡реЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ - рдореАрдбрд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рднреА рд╕реЗрд╡рд╛ рд╣реИред

рд╕рд╛рдордЧреНрд░реА рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдБ рдереАрдВред рдкреНрд░рддреНрдпреЗрдХ рдирдП рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдордиреЗ рдХреБрдЫ рдирдпрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ, рдкрд╣рд▓реЗ рдЙрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреИрдВрдб рдкрд░ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдкреНрд░реАрдлреЗрдВрдЪрд┐рдВрдЧ рдЕрдм рдЖрдИрдлрдиреА рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╕рдВрдзрд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдереАред

рдорд╛рдирдХ рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ


IOS 10 рдореЗрдВ, Apple рдиреЗ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдкреНрд░реАрдлреЗрдЯрд┐рдВрдЧ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХреАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, UICollectionView рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ:

@property (nonatomic, weak, nullable) id<UICollectionViewDataSourcePrefetching> prefetchDataSource; @property (nonatomic, getter=isPrefetchingEnabled) BOOL prefetchingEnabled; 

рджреЗрд╢реА рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдкреНрд░реАрдлрд╝реИрдХрдЯрдбрд╛рдЯрд╛ рд╕реНрд░реЛрдд рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ рдЬреЛ UICollectionViewDatasourcePrefetching рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ YES рдореЗрдВ рджреВрд╕рд░рд╛ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 - (void)collectionView:(UICollectionView *)collectionView prefetchItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths; - (void)collectionView:(UICollectionView *)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths; 

рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдореЗрдВ, рдЖрдк рд╕рд╛рдордЧреНрд░реА рдХреА рддреИрдпрд╛рд░реА рдкрд░ рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

IFunny рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛:

 NSMutableArray<NSURL *> *urls = [NSMutableArray new]; for (NSIndexPath *indexPath in indexPaths) { NSObject<IFFeedItemProtocol> *item = [self.model itemAtIndex:indexPath.row]; NSURL *downloadURL = item.downloadURL; if (downloadURL) { [urls addObject:downloadURL]; } } [self.downloadManager updateActiveURLs:urls]; [urls enumerateObjectsUsingBlock:^(NSURL *_Nonnull url, NSUInteger idx, BOOL *_Nonnull stop) { [self.downloadManager downloadContentWithURL:url.absoluteString forView:nil withOptions:0]; }]; 

рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдИрдлрдиреА рдЯреЗрдк рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рдж рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, UICollectionView рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдХрд╛ рдХрд╛рдо рдмрд╣реБрдд рд╣рдж рддрдХ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рджреГрд╢реНрдп рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рд╣рдо рдорд╛рдирдХ рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕реНрдерд┐рд░ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЕрдкрдиреЗ рдкреНрд░реАрдлреЗрдЪрд┐рдВрдЧ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЬреЛ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред

рд╣рдорд╛рд░реЗ рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рдкреНрд░реАрдлреЗрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдЖрдИрдлрдиреА рдлреАрдб рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрд╛:

  1. рдПрдХ рдлрд╝реАрдб рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ: рдЪрд┐рддреНрд░, рд╡реАрдбрд┐рдпреЛ, рд╡реЗрдмреИрдк, рджреЗрд╢реА рд╡рд┐рдЬреНрдЮрд╛рдкрдиред
  2. рдЯреЗрдк рдкреЗрдЬреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  3. рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝реАрдб рдХреЛ рдХреЗрд╡рд▓ рдЖрдЧреЗ рдлрд╝реНрд▓рд┐рдк рдХрд░рддреЗ рд╣реИрдВред
  4. IFunny рдореЗрдВ, 20% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ LTE рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред

рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рдПрдХ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рд╣реИ:

  1. рдЯреЗрдк рдореЗрдВ 1 рд╕рдХреНрд░рд┐рдп рддрддреНрд╡ рд╣реИ, рдмрд╛рдХреА рд╕рднреА рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВред
  2. рд╕рдХреНрд░рд┐рдп рддрддреНрд╡ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдВрдд рддрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  3. рдлрд╝реАрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдордЧреНрд░реА рдЖрдЗрдЯрдо рдХрд╛ рдЕрдкрдирд╛ рд╡рдЬрди рд╣реИред
  4. рд╡рд░реНрддрдорд╛рди рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдкрд░, рдЖрдк рдПрди рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЖрдЗрдЯрдо рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  5. рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЯреЗрдк рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдХреНрд░рд┐рдп рддрддреНрд╡ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рддрддреНрд╡ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд░рджреНрдж рдХрд░реЗрдВред

рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХреЛрдб рдореЗрдВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдХрдИ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдФрд░ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • IFPrefetchedCollectionProtocol

 @protocol IFPrefetchedCollectionProtocol @property (nonatomic, readonly) NSUInteger prefetchItemsCount; - (NSObject<IFFeedItemProtocol> *)itemAtIndex:(NSInteger)index; @end 

рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрдХреНрд╖рд╛ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

  • IFContentPrefetcher

 @interface IFContentPrefetcher : NSObject @property (nonatomic, weak) NSObject<IFPrefetchedCollectionProtocol> *collection; @property (nonatomic, assign) NSInteger activeIndex; @end 

рд╡рд░реНрдЧ рд╕рд╛рдордЧреНрд░реА рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

  • IFPrefetchOperation

 @interface IFPrefetchOperation : NSObject @property (nonatomic, readonly) NSUInteger cost; - (void)fetchMinumumBuffer; - (void)fetchEntireBuffer; - (void)pause; - (void)cancel; - (BOOL)isEqualOperation:(IFPrefetchOperation *)object; @end 

рдпрд╣ рдПрдХ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░реАрдлрд╝реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ - рд╡рдЬрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рджреЛ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ:

  1. рдЪрд┐рддреНрд░ред рдЗрд╕рдХрд╛ рд╡рдЬрди 1 рд╣реИред рд╣рдореЗрд╢рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд░реА рд╣реБрдИ;
  2. рд╡реАрдбрд┐рдпреЛред рдЗрд╕рдХрд╛ рд╡рдЬрди 2 рд╣реИред рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд╛рд░ред рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ, рдкрд╣рд▓реЗ 200 KB рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдордиреЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдпреВрдЖрдИ рддрддреНрд╡ рдХреЗ рд╣рд┐рдЯ рдХреЛ рдкреНрд░рддрд┐ 1000 рд╕рд╛рдордЧреНрд░реА рддрддреНрд╡реЛрдВ рдХреЛ рджреЗрдЦрд╛ред

рдЗрд╕ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рдорд╛рдирдХ рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ 30 рдЗрдВрдкреНрд░реЗрд╢рди / 1000 рддрддреНрд╡ рдереЗред рдирдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж, рдпрд╣ рдореАрдЯреНрд░рд┐рдХ 25 рдЗрдВрдкреНрд░реЗрд╢рди / 1000 рддрддреНрд╡реЛрдВ рддрдХ рдЧрд┐рд░ рдЧрдпрд╛ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд▓реЛрдбрд░ рдЫрд╛рдкреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ 20% рдХреА рдХрдореА рдЖрдИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдереЛрдбрд╝реА рд╡реГрджреНрдзрд┐ рд╣реБрдИред

рддрдм рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реБрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗ - iFunny рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЯреЗрдкред

рдкреНрд░реАрдлреЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЪрдпрди


рд╡рд┐рдХрд╕рд┐рдд рдкреНрд░реАрдлрд╝реЗрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:

  1. рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдХреБрд▓ рд▓рд╛рдЧрддред
  2. рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрддред

рд╣рдо рд▓реЛрдбрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдорд╛рдкрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред

рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

  1. KIF рдЪреМрдЦрдЯреЗ, OHHTTPStubs рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЧреНрд░реЗ рдкрд░реАрдХреНрд╖рдгред
  2. рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ xcodebuildред
  3. рдбреЗрд╡рд▓рдкрд░ рдореЗрдВ 3 рдЬреА рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдЙрдкрд▓рдмреНрдз рд╣реИ - рдиреЗрдЯрд╡рд░реНрдХ рд▓рд┐рдВрдХ рдХрдВрдбреАрд╢рдирд░ рд╕реЗрдЯрд┐рдВрдЧред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдХрд░рдг рдиреЗ рд╣рдорд╛рд░реА рдорджрдж рдХреИрд╕реЗ рдХреАред

рдкрд░реАрдХреНрд╖рдг


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдкрд░ iOS рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд KIF рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

KIF рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреБрдЫ рдЖрд╕рд╛рди рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, KIF рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
https://github.com/kif-framework/KIF#use-with-swift

рдЯреЗрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреЛ рдЪреБрдирд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ, рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓рд╛:

  - (void)setUp { [super setUp]; [self clearCache]; [[NSURLCache sharedURLCache] removeAllCachedResponses]; [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *_Nonnull request) { return [request.URL.absoluteString isEqualToString:@"http://fun.co/rp/?feed=featured&limit=30"]; } withStubResponse:^OHHTTPStubsResponse *_Nonnull(NSURLRequest *_Nonnull request) { NSString *path = OHPathForFile(@"featured.json", self.classForCoder); OHHTTPStubsResponse *response = [[OHHTTPStubsResponse alloc] initWithFileAtPath:path statusCode:200 headers:@{ @"Content-Type" : @"application/json" }]; return response; }]; } 

рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯрдЕрдк рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдореЗрдВ рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдиреНрдЪ рдкрд░ рд╕рд╛рдордЧреНрд░реА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд▓реЛрдб рд╣реЛ рдЬрд╛рдП рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреИрд╢ рдлрд╝реЛрд▓реНрдбрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рдПред

рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ OHHTTPStubs рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рдХреБрдЫ рд╕рд░рд▓ рдЪрд░рдгреЛрдВ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ:

  1. рдХреНрд╡реЗрд░реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдпрд╣ API рдХреЗ рдлреАрдЪрд░реНрдб рдлреАрдб рдЕрдиреБрд░реЛрдз рдХрд╛ URL рд╣реИ - http://fun.co/rp/?feed=featured&limit=30
  2. рдЖрд╡рд╢реНрдпрдХ рдЙрддреНрддрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред
  3. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рдпрд╣ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рд╣реЗрдбрд░ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рд╣реИред
  4. OHHTTPStubs рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВред

рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ OHHTTPStubs рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:
http://cocoadocs.org/docsets/OHHTTPStubs/

рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдпрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 - (void)testFeed { KIFUIViewTestActor *feed = [viewTester usingLabel:@"ScrolledFeed"]; [feed waitForView]; [self setupCustomPrefetchParams]; for (NSInteger i = 1; i <= 1000; i++) { [feed waitForCellInCollectionViewAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; [viewTester waitForTimeInterval:1.0f]; } [self appendStatisticLine]; } 

KIF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдореЗрдВ рдПрдХ рдлрд╝реАрдб рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ 1 рд╕реЗрдХрдВрдб рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рд╕рд╛рде 1000 рд╕рд╛рдордЧреНрд░реА рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

SetupCustomPrefetchParams рд╡рд┐рдзрд┐ рдкрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рджрд┐рдЦрд╛рдП рдЧрдП рд▓реЛрдбрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рд░рдирдЯрд╛рдЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рд╕реЗрд╡рд╛ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ:

 + (void)load { [self swizzleSelector:@selector(trackEventLoaderViewedVideo:) ofClass:[IFAnalyticService class]]; } + (void)swizzleSelector:(SEL)originalSelector ofClass:(Class) class { Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod([self class], originalSelector); BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(class, originalSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } } - (void)trackEventLoaderViewedVideo : (BOOL)onVideo { if (onVideo) { [IFTestFeed trackLoaderOnVideo]; } else { [IFTestFeed trackLoaderOnImage]; } } 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░реА рдорд┐рд▓рддреА рд╣реИ рдФрд░ рд╕рдорд╛рди рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд▓реЙрдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд▓рд┐рдЦрддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрд╡рдЪрд╛рд▓рди


рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде xcodebuild рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдХреЛрдб рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░реАрдкреЛрд╕реЗрд░рд░ рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рддрд░реНрдХ рдХрд╛ рдирд╛рдо рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:



рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдХреЛрдб рд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рдореИрдХреНрд░реЛ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП:

 #define STRINGIZE(x) #x #define BUILD_PARAM(x) STRINGIZE(x) 

рдЕрдм рдЬрдм рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ xcodebuild рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

 xcodebuild test -workspace iFunny.xcworkspace -scheme iFunnyUITests -destination 'platform=iOS,id=DEVICE_ID' MAX_PREFETCH_COST="5" VIDEO_COST="2" IMAGE_COST="2" 

рдХреЛрдб рдореЗрдВ рдЖрдк рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 - (void)setupCustomPrefetchParams { NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; formatter.numberStyle = NSNumberFormatterNoStyle; [IFAppController instance].prefetchParams.goodNetMaxCost = [formatter numberFromString:@BUILD_PARAM(MAX_PREFETCH_COST)]; [IFAppController instance].prefetchParams.videoCost = [formatter numberFromString:@BUILD_PARAM(VIDEO_COST)]; [IFAppController instance].prefetchParams.imageCost = [formatter numberFromString:@BUILD_PARAM(IMAGE_COST)]; } 

рдЕрдм рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдСрдлрд╝рд▓рд╛рдЗрди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред

рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ 10 рдмрд╛рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде xcodebuild рдЪрд▓ рд░рд╣рд╛ рд╣реИ:

 max=10 for i in `seq 1 $max` do xcodebuild test -workspace iFunny.xcworkspace -scheme iFunnyUITests -destination 'platform=iOS,id=DEVICE_ID' MAX_PREFETCH_COST="$1" VIDEO_COST="$2" IMAGE_COST="$3" done 

рд╣рдордиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯреЛрдВ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рддреИрдпрд╛рд░ рдХреАред рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдХрдИ рджрд┐рдиреЛрдВ рддрдХ рдЪрд▓реЗред рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╣рдордиреЗ рдЙрдирдХреА рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреАред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рд░реВрдк (рд╡реАрдбрд┐рдпреЛ рдпрд╛ рдЪрд┐рддреНрд░) рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ iFunny рд░рд┐рдмрди рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдЪ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░реАрдлрд╝реИрдЪрд┐рдВрдЧ рдирд┐рдХрд▓рд╛ред

рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░


рд▓реЗрдЦ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдореБрдЦреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдЖрд╡реЗрджрди рдХреЗ рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА:

  • рдиреАрд░рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЪреМрдЦрдЯреЗ рдХрд╛ рдЙрдкрдпреЛрдЧред
  • рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП xcodebuild рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рдиред
  • рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА, рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреИрдВрдб рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореЙрдбреНрдпреВрд▓ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдкрд░реАрдХреНрд╖рдг рддреИрдпрд╛рд░ рдХрд┐рдП рд╣реИрдВ рдЬреЛ рд╣рдо рд╕рдордп-рд╕рдордп рдкрд░ рдЖрд╡реЗрджрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдкреБрдирд╢реНрдЪ: рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЙрддреНрдкрд╛рджрди рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдирдИ рдкреНрд░реАрдлреЗрдЯрд┐рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓рдЧрднрдЧ 8% рдЬреАрддрддреА рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рд▓реЛрдбрд░реЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ 3% рдХреА рдХрдореА рдЖрдИ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдордиреЗ iFunny рдХреЛ 3% рдЕрдзрд┐рдХ рдмрд╛рд░ рдореБрд╕реНрдХрд╛рди рджреЗрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ :)

PPS: рд╣рдо рд╡рд╣рд╛рдВ рд░реБрдХрдиреЗ рдирд╣реАрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдЖрдЧреЗ рднреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред

Source: https://habr.com/ru/post/hi417059/


All Articles