рдорд╛рд░реНрд╡рд▓ рдирд╛рдпрдХреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо RestKit 0.22.x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

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



IOS рдФрд░ OSX рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ-рдорд╛рдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рд░реЗрд╕реНрдЯрд┐рдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг RESTful API рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рдЗрд╕рдХреА рд╕рдмрд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛрд░рдбрд╛рдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЖрдЗрдП рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рд▓реЗрдХрд░ рдЙрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд╣рдорд╛рд░реЗ iOS рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рддрдХ рдХрд╛ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд░реЗрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдКрдм рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╡рд┐рд╢реНрд╡ рдкреНрд░рд╕рд┐рджреНрдз рдХреЙрдорд┐рдХ рдмреБрдХ рдХрдВрдкрдиреА рдорд╛рд░реНрд╡рд▓ рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред



рд▓реЗрдЦ рдПрдХ рддрд░рд╣ рдХрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдИрдУрдПрд╕ рдПрд╕рдбреАрдХреЗ, рдХреЛрд░ рдбреЗрдЯрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдЬреИрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред







1. рдЪрд╛рдмрд┐рдпрд╛рдБ рдорд╛рд░реНрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ



рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдорд╛рд░реНрд╡рд▓ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░реЗрдВред

рддреБрдЪреНрдЫ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рдЦрд╛рддрд╛ рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╣рдорд╛рд░реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБред



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



2. рдЖрд░рдВрдн рдХрд░рдирд╛



Xcode рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ iPhone рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рд╡рд┐рдВрдбреЛ рдореЗрдВ "рдХреЛрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдлрд╝реАрд▓реНрдб рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдПрдХ рдЪреЗрдХ рдорд╛рд░реНрдХ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред



рдЕрдм рдкреЛрд░реНрдЯрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ Character



рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдЪрд░рд┐рддреНрд░ рд╡рд╕реНрддреБ
 Character { id (int, optional): The unique ID of the character resource., name (string, optional): The name of the character., description (string, optional): A short bio or description of the character., modified (Date, optional): The date the resource was most recently modified., resourceURI (string, optional): The canonical URL identifier for this resource., urls (Array[Url], optional): A set of public web site URLs for the resource., thumbnail (Image, optional): The representative image for this character., comics (ComicList, optional): A resource list containing comics which feature this character., stories (StoryList, optional): A resource list of stories in which this character appears., events (EventList, optional): A resource list of events in which this character appears., series (SeriesList, optional): A resource list of series in which this character appears. }
      
      



рдЗрдирдореЗрдВ рд╕реЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП? рд╢рд╛рдпрдж, рд╣рдо рдЦреБрдж рдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдирд╛рдо, рдЪрд┐рддреНрд░ рдФрд░ рд╡рд┐рд╡рд░рдг рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВред рдЖрдЗрдП Xcode рдореЗрдВ рдЕрдкрдиреА * .xcdatamodeld рдлрд╛рдЗрд▓ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ Character



рдПрдВрдЯрд┐рдЯреА рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ (рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ) рд╣рдорд╛рд░реА рджреВрд░рд╕реНрде рд╡рд╕реНрддреБ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧреАред





рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рджреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдП рд╣реИрдВ: рдкрд╣рд▓рд╛, charID



, рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП "рджреЗрд╢реА рдорд╛рд░реНрд╡рд▓ рдХреА" id



рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬрдмрдХрд┐ рджреВрд╕рд░реЗ, innerID



рдХреЛ рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред charDescription



рдФрд░ рдирд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдХреНрд░рдорд╢рдГ рджреВрд░рд╕реНрде рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡рд░реНрдгрди рдФрд░ рдирд╛рдо рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рднреА рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдмрдирд╛рдИрдВ, thumbnailImageData



рдФрд░ thumbnailURLString



, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ JSON рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ thumbnail



рдкреНрд░рдХрд╛рд░ рдХреА Image



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг thumbnail



рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрддреНрддрд░ рд╕реЗ рд╣реИ:

 "thumbnail": { "path": "http://i.annihil.us/u/prod/marvel/i/mg/8/c0/4ce5a0e31f109", "extension": "jpg" }
      
      





рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред



рдЕрдм, рдХреЛрд░ рдбреЗрдЯрд╛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреА рднреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧреАред рдПрдХ Character



рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ рдЬреЛ NSManagedObject



рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдБ рдЙрд╕рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ:

 @interface Character : NSManagedObject { NSDictionary *_thumbnailDictionary; } @property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSNumber *charID; @property (nonatomic, retain) NSNumber *innerID; @property (nonatomic, retain) NSString *charDescription; @property (nonatomic, retain) NSData *thumbnailImageData; @property (nonatomic, retain) NSString *thumbnailURLString; @property NSDictionary *thumbnailDictionary; //       + (NSInteger)allCharsCountWithContext:(NSManagedObjectContext *)managedObjectContext; //     innerID. + (Character *)charWithManagedObjectContext:(NSManagedObjectContext *)context andInnerID:(NSInteger)charInnerID; @end
      
      





рдпрд╣рд╛рдБ, рд╕реНрдкрд╖реНрдЯ рдЕрдиреБрд░реВрдкрддрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, thumbnailDictionary



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



3. RestKit рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓



рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реЗрд╕реНрдЯрдХрд┐рдЯ (рдЗрд╕рдХреЗ рдмрд╛рдж - рдЖрд░рдХреЗ) рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣ рдпрд╣рд╛рдБ рд╡рд┐рд╕реНрддреГрдд рд╣реИ (рдпрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рдХреЛрдХреЛрдЖ рдкреНрд░реЗрдореА рд╣реИрдВ)ред



рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ GDMarvelRKObjectManager



( NSObject



) рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ RK рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ RKObjectManager



рдФрд░ RKManagedObjectStore



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



рдЖрд░рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ред RKManagedObjectStore



рдХреЛрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рдо рдХреЛ RKManagedObjectStore



рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реАрдзреЗ NSManagedObjectContext



рдпрд╛ NSManagedObjectModel



рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред RKObjectManager



рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░рдг (рдорд┐рд▓рд╛рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЗрдВрджреНрд░реАрдХреГрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЖрд╡рд╢реНрдпрдХ рдорд╛рди, рд╕рдлрд▓ рдорд╛рдирдЪрд┐рддреНрд░рдг рдкрд░, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рдереЗ?

рдЕрдкрдиреА * .h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ RK #import <RestKit/RestKit.h>



ред

рд╣рдорд╛рд░реЗ рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдореЗрдВ рдЧреБрдг рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рдЪрд░ рд╣реЛрдВрдЧреЗ:

 @implementation GDMarvelRKObjectManager { RKObjectManager *objectManager; RKManagedObjectStore *managedObjectStore; }
      
      





рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, - (id)init



рд╡рд┐рдзрд┐ рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХ рдЖрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 //  AFNetworking HTTPClient NSURL *baseURL = [NSURL URLWithString:@"http://gateway.marvel.com/"]; AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; // RKObjectManager objectManager = [[RKObjectManager alloc] initWithHTTPClient:client];
      
      





рдЕрдм рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗред рдХреЛрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЖрдЗрдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ RKManagedObjectStore рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред

 - (void)configureWithManagedObjectModel:(NSManagedObjectModel *)managedObjectModel { if (!managedObjectModel) return; managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; NSError *error; if (!RKEnsureDirectoryExistsAtPath(RKApplicationDataDirectory(), &error)) RKLogError(@"Failed to create Application Data Directory at path '%@': %@", RKApplicationDataDirectory(), error); NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"RKMarvel.sqlite"]; if (![managedObjectStore addSQLitePersistentStoreAtPath:path fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error]) RKLogError(@"Failed adding persistent store at path '%@': %@", path, error); [managedObjectStore createManagedObjectContexts]; objectManager.managedObjectStore = managedObjectStore; }
      
      





рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рд╣рдорд╛рд░реА рджреЛ рдореБрдЦреНрдп рдЖрд░рдХреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ: objectManager



рдФрд░ objectManager



ред



рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рдЖрдЧреЗ рдХрд╛ рдХрд╛рдо рджреЛ рдореБрдЦреНрдп рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ GDMarvelRKObjectManager



рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдирд╛ рд╣реИ: рдХреЛрд░ рдбреЗрдЯрд╛ рдЗрдХрд╛рдИ рдФрд░ рджреВрд░рд╕реНрде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмреАрдЪ рдореИрдкрд┐рдВрдЧ (рдкрддреНрд░рд╛рдЪрд╛рд░) рдЬреЛрдбрд╝рдирд╛, рд╕рд╛рде рд╣реА рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред

рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 - (void)addMappingForEntityForName:(NSString *)entityName andAttributeMappingsFromDictionary:(NSDictionary *)attributeMappings andIdentificationAttributes:(NSArray *)ids andPathPattern:(NSString *)pathPattern { if (!managedObjectStore) return; RKEntityMapping *objectMapping = [RKEntityMapping mappingForEntityForName:entityName inManagedObjectStore:managedObjectStore]; // ,    . [objectMapping addAttributeMappingsFromDictionary:attributeMappings]; // ,    .   ,       . objectMapping.identificationAttributes = ids; //   ,           . RKResponseDescriptor *characterResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:objectMapping method:RKRequestMethodGET pathPattern:[NSString stringWithFormat:@"%@%@", MARVEL_API_PATH_PATTERN, pathPattern] keyPath:@"data.results" statusCodes:[NSIndexSet indexSetWithIndex:200]]; [objectManager addResponseDescriptor:characterResponseDescriptor]; }
      
      







рдпрд╣рд╛рдБ рд╣рдо responseDescriptorWithMapping:...



рд╡рд┐рдзрд┐ рдХреЗ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ responseDescriptorWithMapping:...



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, pathPattern



рдкреИрд░рд╛рдореАрдЯрд░ред рдореИрдХреНрд░реЛ MARVEL_API_PATH_PATTERN



(рдорд╛рди @"v1/public/"



) рдФрд░ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ pathPattern



, рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ @"characters"



ред рдпрджрд┐ рд╣рдо рд╡рд░реНрдгреЛрдВ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд╣рддреЗ рд╣реИрдВ, рдХреЙрдорд┐рдХреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рддреЛ рд╣рдо рд▓рд╛рдЗрди @тАЭcomicsтАЭ



рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдлрд┐рд░ рд╕реЗ @"v1/public/"



рдЬреБрдбрд╝рд╛ рд╣реЛрдЧрд╛ред

рджреВрд╕рд░рд╛ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдорд╛рди @"data.results"



рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП @"data.results"



рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛? рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдорд╛рд░реНрд╡рд▓ рдиреЗ рдПрдХ рд╣реА рдЖрд╡рд░рдг рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА рдЙрддреНрддрд░реЛрдВ рдХреЛ рд▓рдкреЗрдЯ рджрд┐рдпрд╛, рдФрд░ рдЬрдм рд╣рдо рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛:

рд╡рд░реНрдг рдЖрд╡рд░рдг
 { "code": "int", "status": "string", "copyright": "string", "attributionText": "string", "attributionHTML": "string", "data": { "offset": "int", "limit": "int", "total": "int", "count": "int", "results": [ { "id": "int", "name": "string", "description": "string", "modified": "Date", "resourceURI": "string", "urls": [ { "type": "string", "url": "string" } ], "thumbnail": { "path": "string", "extension": "string" }, "comics": { "available": "int", "returned": "int", "collectionURI": "string", "items": [ { "resourceURI": "string", "name": "string" } ] }, "stories": { "available": "int", "returned": "int", "collectionURI": "string", "items": [ { "resourceURI": "string", "name": "string", "type": "string" } ] }, "events": { "available": "int", "returned": "int", "collectionURI": "string", "items": [ { "resourceURI": "string", "name": "string" } ] }, "series": { "available": "int", "returned": "int", "collectionURI": "string", "items": [ { "resourceURI": "string", "name": "string" } ] } } ] }, "etag": "string" }
      
      





рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдирд╛рдпрдХреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реВрдЪреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрд░рдХреЗ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реНрддрд░реЛрдВ рдХреЗ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред рдорд╛рди @"data.results"



рдХреЗрд╡рд▓ рдЙрд╕ рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ "рдиреАрдЪреЗ рдЬрд╛рдиреЗ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред



рдЖрдВрддрд░рд┐рдХ рдЖрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ getMarvelObjectsAtPath



рд╣реЛрдЧрд╛, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ getObjectsAtPath



рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ getObjectsAtPath



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



рдореЗрдВ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкреАрдврд╝реА рдХреЛ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:

 - (void)getMarvelObjectsAtPath:(NSString *)path parameters:(NSDictionary *)params success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure { //    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyyMMddHHmmss"]; NSString *timeStampString = [formatter stringFromDate:[NSDate date]]; NSString *hash = [[[NSString stringWithFormat:@"%@%@%@", timeStampString, MARVEL_PRIVATE_KEY, MARVEL_PUBLIC_KEY] MD5String] lowercaseString]; NSMutableDictionary *queryParams = [NSMutableDictionary dictionaryWithDictionary:@{@"apikey" : MARVEL_PUBLIC_KEY, @"ts" : timeStampString, @"hash" : hash}]; if (params) [queryParams addEntriesFromDictionary:params]; //      objectManager     [objectManager getObjectsAtPath:[NSString stringWithFormat:@"%@%@", MARVEL_API_PATH_PATTERN, path] parameters:queryParams success:success failure:failure]; }
      
      





рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрдб NSString



- MD5String



рдКрдкрд░ рдЧреИрд░-рдорд╛рдирдХ рд╢реНрд░реЗрдгреА рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд▓рд╛рдЗрди рд╕реЗ рдПрдордбреА 5-рдЯреНрд░рдВрдХ рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рджреЗрдЦреЗрдВ ред

рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдЕрднреА рднреА рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рд╣реЛрдЧреА - (NSManagedObjectContext *)managedObjectContext



, рдЬреЛ - (NSManagedObjectContext *)managedObjectContext



рдХреЗ рдореБрдЦреНрдп рд╕рдВрджрд░реНрдн рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП + (GDMarvelRKObjectManager *)manager



рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ ( рд╕рд┐рдВрдЧрд▓рдЯрди ) рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реЛрдЧрд╛ред



4. рдореБрдЦреНрдп рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ



рдЗрд╕рдХреЗ GDBaseViewController



рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдмреБрдирд┐рдпрд╛рджреА GDBaseViewController



рдирд┐рдпрдВрддреНрд░рдХ GDBaseViewController



рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдирдИ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрдЯреЗрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ - (void)animateActivityIndicator:(BOOL)animate



ред viewDidLoad



рд╡рд┐рдзрд┐ рдореЗрдВ viewDidLoad



UIActivityIndicatorView



рдкреНрд░рдХрд╛рд░ рдХрд╛ рдпрд╣ рд╕рдВрдХреЗрддрдХ рдмрдирд╛рдПрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдорд╛рди рдХреЛ UIActivityIndicatorView *activityIndicator



рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ UIActivityIndicatorView *activityIndicator



рдФрд░ рдЗрд╕реЗ self.view



рдЬреЛрдбрд╝реЗрдВред

рдПрдиреАрдореЗрд╢рди рдСрди / рдСрдл рд╡рд┐рдзрд┐ рдореЗрдВ, рдирд┐рдореНрди рдХреЛрдб рд╣реЛрдЧрд╛:

animateActivityIndicator: рдХреЛрдб
 - (void)animateActivityIndicator:(BOOL)animate { activityIndicator.hidden = !animate; if (animate) { [self.view bringSubviewToFront:activityIndicator]; [activityIndicator startAnimating]; } else [activityIndicator stopAnimating]; }
      
      





рдЕрдм, рдЬрдм рд╣рдо рдХрд┐рд╕реА рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП YES



рдорд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:





рдЕрдЧрд▓рд╛, рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ GDMainViewController



рдПрдХ GDMainViewController



рдирд┐рдпрдВрддреНрд░рдХ GDMainViewController



ред рдпрд╣рд╛рдБ рдЙрд╕рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ:

 @interface GDMainViewController : GDBaseViewController <UITableViewDataSource, UITableViewDelegate, UIAlertViewDelegate> { UITableView *table; NSInteger numberOfCharacters; AllAroundPullView *bottomPullView; BOOL noRequestsMade; } @end
      
      





рдЗрд╕ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо UITableView



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



рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕рднреА рдЖрд░рдВрднрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж - (void)viewDidLoad



, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ CoreData рдореЙрдбрд▓ рдХреЛ RKManagedObjectStore



рд╣рдорд╛рд░реЗ GDMarvelRKObjectManager



рд░реИрдкрд░ GDMarvelRKObjectManager



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ GDMarvelRKObjectManager



:

 NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Marvel" withExtension:@"momd"]; [[GDMarvelRKObjectManager manager] configureWithManagedObjectModel:[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]]; //        Character: [[GDMarvelRKObjectManager manager] addMappingForEntityForName:@"Character" andAttributeMappingsFromDictionary:@{ @"name" : @"name", @"id" : @"charID", @"thumbnail" : @"thumbnailDictionary", @"description" : @"charDescription" } andIdentificationAttributes:@[@"charID"] andPathPattern:MARVEL_API_CHARACTERS_PATH_PATTERN];
      
      





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



рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ andPathPattern:



рдкреИрд░рд╛рдореАрдЯрд░, рд╕реНрдЯреНрд░рд┐рдВрдЧ @"characters"



рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдореИрдХреНрд░реЛ MARVEL_API_CHARACTERS_PATH_PATTERN



) - рджреВрд░рд╕реНрде JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдоред



рд╣рдордиреЗ рдореИрдкрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, [self loadCharacters]



рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ред

рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

 - (void)loadCharacters { numberOfCharacters = [Character allCharsCountWithContext:[[GDMarvelRKObjectManager manager] managedObjectContext]]; if (noRequestsMade && numberOfCharacters > 0) { noRequestsMade = NO; return; } [self animateActivityIndicator:YES]; noRequestsMade = NO; [[GDMarvelRKObjectManager manager] getMarvelObjectsAtPath:MARVEL_API_CHARACTERS_PATH_PATTERN parameters:@{@"offset" : @(numberOfCharacters)} success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { [self animateActivityIndicator:NO]; NSInteger newInnerID = numberOfCharacters; for (Character *curCharacter in mappingResult.array) { if ([curCharacter isKindOfClass:[Character class]]) { curCharacter.innerID = @(newInnerID); newInnerID++; //     (     ),   ,        [self saveToStore]; } } numberOfCharacters = newInnerID; [table reloadData]; bottomPullView.hidden = NO; [bottomPullView finishedLoading]; } failure:^(RKObjectRequestOperation *operation, NSError *error) { [bottomPullView finishedLoading]; [[[UIAlertView alloc] initWithTitle:@"Marvel API Error" message:operation.error.localizedDescription delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Retry", nil] show]; }]; }
      
      





рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреБрд▓ рд╡рд░реНрдг рдорд┐рд▓рддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рди рдореБрдЦреНрдп рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдо рдкреНрд░реЗрд╖рд┐рдд рдСрдлрд╕реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдорд╛рди рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдорд╛рд░реНрд╡рд▓ рд╕рд░реНрд╡рд░ рдХреЗрд╡рд▓ рдирдП рд╣реАрд░реЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд▓реМрдЯрд╛рдПрдЧрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдирд╛рдпрдХ рдкреНрд░рддреНрдпреЗрдХ 20 рдЯреБрдХрдбрд╝реЗ рдХреЗ рдкреИрдХ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ)ред

рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреЗ getMarvelObjectsAtPath



рдЖрд╡рд░рдг getMarvelObjectsAtPath



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдореБрдЦреНрдп рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ:

рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬреЛ рдЕрднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ - рдпреЗ рд╕рдлрд▓рддрд╛ рд╣реИрдВ: рдФрд░ рд╡рд┐рдлрд▓рддрд╛:, рдЬреЛ рдмреНрд▓реЙрдХ рд╣реИрдВ рдЬреЛ рдХреНрд░рдорд╢рдГ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдлрд▓ рдФрд░ рдЕрд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреА рд╕рдлрд▓ рдкреНрд░рд╛рдкреНрддрд┐ рдкрд░, рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ innerID



рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрдгреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЬрд╛рджреВ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдХреЛрд░рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЖрд░рдХреЗ рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рдпрд╛ред (рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдлрд╝реАрд▓реНрдбреНрд╕ / рдЧреБрдгреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдкрд┐рдВрдЧ рдореИрдЪ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, innerID



[self saveToStore]



рдХрд╣рдХрд░ innerID



рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред

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



рдХреЛрдб рд╕рдВрдЧреНрд░рд╣рдг рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 - (void)saveToStore { NSError *saveError; if (![[[GDMarvelRKObjectManager manager] managedObjectContext] saveToPersistentStore:&saveError]) XLog(@"%@", [saveError localizedDescription]); }
      
      





рдЖрдк bottomPullView



рдЙрджрд╛рд╣рд░рдг bottomPullView



рд╕рдВрджрд░реНрдн рднреА рджреЗрдЦреЗрдВрдЧреЗред рдпрд╣ рд╡реИрд░рд┐рдПрдмрд▓ AllAroundPullView



( GitHub рд╕реЗ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ ) рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдЙрдкрдпреЛрдЧреА рдирд┐рдпрдВрддреНрд░рдг рдЬреЛ рдЖрдкрдХреЗ UIScrollView



рд╕рднреА рдкрдХреНрд╖реЛрдВ рд╕реЗ Pull-To-Resfresh рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ, рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдирд┐рдЪрд▓реЗ рдХрд┐рдирд╛рд░реЗ рддрдХ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдКрдкрд░ рдЦреАрдВрдЪ рд▓реЗрдВрдЧреЗред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ - (void)viewDidLoad



рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

 bottomPullView = [[AllAroundPullView alloc] initWithScrollView:table position:AllAroundPullViewPositionBottom action:^(AllAroundPullView *view){ [self loadCharacters]; }]; bottomPullView.hidden = YES; [table addSubview:bottomPullView];
      
      





рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ: рд╣рдо рдирдП рдирд╛рдпрдХреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╡рд┐рдзрд┐ loadCharacters



ред



рдЦреИрд░, рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕рдлрд▓ рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдпрджрд┐ рд╕рдмрдХреБрдЫ рд╕рд╣реА рд╣реЛ рдЧрдпрд╛, рдФрд░ рдЖрд░рдХреЗ I restkit.network:RKObjectRequestOperation.m:220 GET 'http://your-url.here' (200 OK / 20 objects)



рдиреЗ I restkit.network:RKObjectRequestOperation.m:220 GET 'http://your-url.here' (200 OK / 20 objects)



рдХреБрдЫ рдРрд╕рд╛ I restkit.network:RKObjectRequestOperation.m:220 GET 'http://your-url.here' (200 OK / 20 objects)



рдЬреЛ I restkit.network:RKObjectRequestOperation.m:220 GET 'http://your-url.here' (200 OK / 20 objects)



, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдФрд░ рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпрд╛ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБрдПрдВ рдЖрдзрд╛рд░ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдореБрд▓реЗрдЯрд░ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ, рд╡рд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдвреВрдВрдвреЗрдВред RKMarvel.sqlite



рдмреЗрд╕ RKMarvel.sqlite



рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рд╡рд╣ рдирд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬрдм addSQLitePersistentStoreAtPath:



рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ)ред рдЗрд╕ рдЖрдзрд╛рд░ рдХреЛ SQLite- рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЦреЛрд▓реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЕрдХреНрд╖рд░ рд╕рд╣реЗрдЬреЗ рдЧрдП рд╣реИрдВ:



рд╣реБрд░реНрд░реЗ! рдХреБрдЫ рдирд╛рдпрдХреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдгрди рднреА рд╣реИред рдпрд╣ рд╕рдм "рдЕрдЪреНрдЫрд╛" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред



5. рдЪрд┐рддреНрд░реЛрдВ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕рд╣реЗрдЬрдирд╛ред



рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдзреАрд░ рдкрд╛рдардХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдкрд╛рддреНрд░реЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо UITableView



рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗ (рд▓реЗрдЦрдХ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╣рдо рддреБрд░рдВрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ:

tableView: cellForRowAtIndexPath: рдХреЛрдб
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger row = indexPath.row; NSString *reusableIdentifier = [NSString stringWithFormat:@"%d", row % 2]; UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:reusableIdentifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusableIdentifier]; cell.autoresizingMask = UIViewAutoresizingFlexibleWidth; } [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; if (numberOfCharacters > row) { Character *curCharacter = [Character charWithManagedObjectContext: [[GDMarvelRKObjectManager manager] managedObjectContext] andInnerID:row]; if (curCharacter) { BOOL charHasDescription = ![curCharacter.charDescription isEqualToString:@""]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(70, 0, CGRectGetWidth(cell.contentView.frame) - 70 - (charHasDescription ? 60 : 0), 60)]; label.backgroundColor = [UIColor clearColor]; label.text = curCharacter.name; label.autoresizingMask = UIViewAutoresizingFlexibleWidth; [cell.contentView addSubview:label]; GDCellThumbnailView *thumbnail = [GDCellThumbnailView thumbnail]; if (curCharacter.thumbnailImageData) [thumbnail setImage:[UIImage imageWithData:curCharacter.thumbnailImageData]]; else [self loadThumbnail:thumbnail fromURLString:curCharacter.thumbnailURLString forCharacter:curCharacter]; [cell.contentView addSubview:thumbnail]; cell.accessoryType = charHasDescription ? UITableViewCellAccessoryDetailButton : UITableViewCellSelectionStyleNone; cell.selectionStyle = charHasDescription ? UITableViewCellSelectionStyleGray : UITableViewCellSelectionStyleNone; } } return cell; }
      
      





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



рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореИрдВрдиреЗ рд╕реЗрд▓ рдкрд░ рд░рдЦреЗ рдереЗред рдпрд╣ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдердореНрдмрдиреЗрд▓ рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рд╣рдореЗрдВ "рдХрддрд╛рдИ рдлреВрд▓" рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд░рдЦрддрд╛ рд╣реИред



рдпрджрд┐ loadThumbnail:fromURLString:forCharacter:



рд╡рд┐рдзрд┐ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдЕрдм рдЗрд╕ рдкрд░ рджрд┐рдЦреЗрдЧрд╛:





рдЖрдЗрдП рдирд╛рдпрдХ рдХреЗ рдЪрд┐рддреНрд░ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ RK рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА AFNetworking



рдлреНрд░реЗрдорд╡рд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╣рдо рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрд╡рд▓ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 - (void)loadThumbnail:(GDCellThumbnailView *)view fromURLString:(NSString *)urlString forCharacter:(Character *)character { XLog(@"Loading thumbnail for %@", character.name); AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { character.thumbnailImageData = responseObject; [self saveToStore]; [view setImage:[UIImage imageWithData:responseObject]]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { XLog(@"%@", [error localizedDescription]); }]; [operation start]; }
      
      





рд╡рд╣ рд╕рдм рд╣реИред рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред





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



рдЕрдм рджреЛрдиреЛрдВ рдЪрд┐рддреНрд░реЛрдВ рдФрд░ рдирд╛рдпрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА (рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреЗрд╡рд▓ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рд╣реИрдВ) рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рднрд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╣реЛ рдпрд╛ рди рд╣реЛред



6. рдирд┐рд╖реНрдХрд░реНрд╖ред



RestKit рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛: рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рд░ рдХреЛрдИ рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╣реБрдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рддреБрд░рдВрдд рдЕрдкрд╡рд┐рддреНрд░ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ред рд▓реЗрдЦрдХ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрд░рдХреЗ рдХреА рдмреБрдирд┐рдпрд╛рджреА рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб (рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдЧрд╛рдпрдм рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░рд┐рддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ) рдХреЛ GitHub рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЖрдкрдХреА рдЗрдЪреНрдЫрд╛рдУрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЧрд┐рдЯрд╣рдм рдкрд░ рдкреВрд▓ рдЕрдиреБрд░реЛрдз рднреАред

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








All Articles