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

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

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдПрдкреАрдЖрдИ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдбреЗрдЯрд╛ рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╛рдпрдХреЛрдВ, рдХреЙрдорд┐рдХреНрд╕, рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ, рдШрдЯрдирд╛рдУрдВ рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдд рдХреЛ "рд╕реНрдкрд░реНрд╢" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗрд╡рд▓ рд╡рд░реНрдгреЛрдВ рдХреА рд╕реВрдЪреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рдмрдЪрд╛рдПрдЧрд╛, рдФрд░ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд╛ рд╡рд┐рд╡рд░рдг рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
2. рдЖрд░рдВрдн рдХрд░рдирд╛
Xcode рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ iPhone рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рд╡рд┐рдВрдбреЛ рдореЗрдВ "рдХреЛрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдлрд╝реАрд▓реНрдб рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдПрдХ рдЪреЗрдХ рдорд╛рд░реНрдХ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
рдЕрдм рдкреЛрд░реНрдЯрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░
Character
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдЪрд░рд┐рддреНрд░ рд╡рд╕реНрддреБ
рдЗрдирдореЗрдВ рд╕реЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП? рд╢рд╛рдпрдж, рд╣рдо рдЦреБрдж рдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдирд╛рдо, рдЪрд┐рддреНрд░ рдФрд░ рд╡рд┐рд╡рд░рдг рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВред рдЖрдЗрдП Xcode рдореЗрдВ рдЕрдкрдиреА * .xcdatamodeld рдлрд╛рдЗрд▓ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ 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. }
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 рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЖрдкрдХреА рдЗрдЪреНрдЫрд╛рдУрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЧрд┐рдЯрд╣рдм рдкрд░ рдкреВрд▓ рдЕрдиреБрд░реЛрдз рднреАред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдПрдХ рдФрд░ рдЫрд╡рд┐ рдХреЛ рдЦреБрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ - рдЗрд╕ рдмрд╛рд░ рдпрд╣ рджреВрд╕рд░реЗ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИ, рдЬреЛ рдореБрдЦреНрдп рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдирд╛рдпрдХ рдХреЗ рдирд╛рдо рдХреЗ рдЖрдЧреЗ "рдЬрд╛рдирдХрд╛рд░реА" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЦреБрд▓рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореИрдВрдиреЗ рдЕрдкрдиреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд┐рдпрд╛:
