-
Notifications
You must be signed in to change notification settings - Fork 0
/
RBRWineModel.m
253 lines (171 loc) · 7.18 KB
/
RBRWineModel.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
//
// RBRWineModel.m
// Baccus
//
// Created by Ruben Berreguero on 29/08/13.
// Copyright (c) 2013 Ruben Berreguero. All rights reserved.
//
#import "RBRWineModel.h"
@implementation RBRWineModel
// Cuando creas una propiedad de solo lectura e implementas un getter personalizado,
// como estamos haciendo con photo, el compilador da por hecho que no vas a necesitar
// una variable de instancia. En este caso no es así, y sí que neceisto la variable,
// así que hay que obligarle a que la incluya. Esto se hace con la linea de @synthesize,
// con la que le indicamos que queremos una propiedad llamada photo con una variable
// de instancia llamada _photo.
// En la inmensa mayoría de los casos, esto es opcional.
// Para más info: http://www.cocoaosx.com/2012/12/04/auto-synthesize-property-reglas-excepciones/
@synthesize photo= _photo;
#pragma mark - Propiedades
-(UIImage *) photo{
// Esto va a bloquear y se debería de hacer en segundo plano
// Sin embargo, aun no sabemos hacer eso, asi que de momento lo dejamos
// Carga perezosa: solo cargo la imagen si hace falta.
if (_photo == nil) {
//Obetenr la imagen y la guardamos en cache, aai no la tenemso que descargar¡¡¡
//_photo = [UIImage imageWithData:[NSData dataWithContentsOfURL:self.photoURL]];
_photo= [self imageFromURLSave:self.photoURL];
}
return _photo;
}
#pragma mark - Class methods
+(id) wineWithName: (NSString *) aName
winCompanyName:(NSString *) aWineCompanyName
type: (NSString *) aType
orgin:(NSString *) aOrigin
grapes: (NSArray *) arrayOfGrapes
wineCompanyWeb: (NSURL *) aURL
notes : (NSString *) aNotes
rating:(int) aRating
photoURL:(NSURL *) aPhotoURL{
return [[self alloc] initWithName:aName
wineCompanyName:aWineCompanyName
type:aType
orgin:aOrigin
grapes:arrayOfGrapes
wineCompanyWeb:aURL
notes:aNotes
rating:aRating
photoURL:aPhotoURL];
}
+(id) wineWithName:(NSString *) aName
wineCompanyName: (NSString *) aWineCompanyName
type:(NSString *) aType
origin: (NSString *) aOrigin{
return [[self alloc] initWithName:aName
wineCompanyName:aWineCompanyName
type:aType
origin:aOrigin ];
}
#pragma mark - Init
-(id) initWithName: (NSString *) aName
wineCompanyName:(NSString *) aWineCompanyName
type: (NSString *) aType
orgin:(NSString *) aOrigin
grapes: (NSArray *) arrayOfGrapes
wineCompanyWeb: (NSURL *) aURL
notes : (NSString *) aNotes
rating:(int) aRating
photoURL:(NSURL *) aPhotoURL{
if (self=[super init]){
//Asignamos los parametros a las variables de instancia
//Se recomienda no usar setter
_name= aName;
_wineCompanyName= aWineCompanyName;
_type= aType;
_origin= aOrigin;
_grapes= arrayOfGrapes;
_wineCompanyWeb= aURL;
_notes= aNotes;
_rating= aRating;
_photoURL=aPhotoURL;
}
return self;
}
-(id) initWithName:(NSString *) aName
wineCompanyName: (NSString *) aWineCompanyName
type:(NSString *) aType
origin: (NSString *) aOrigin{
return [self initWithName:aName
wineCompanyName:aWineCompanyName
type:aType orgin:aOrigin
grapes:nil
wineCompanyWeb:nil
notes:nil
rating:NO_RATING
photoURL:nil ];
}
#pragma mark - JSON
//Inicialiador a partir de dicccionario JSON
-(id) initWithDictionary: (NSDictionary *) aDict{
return [self initWithName:[aDict objectForKey:@"name"]
wineCompanyName:[aDict objectForKey:@"company"]
type:[aDict objectForKey:@"type"]
orgin:[aDict objectForKey:@"origin"]
grapes:[self extractGrapesFromJSONArray:[aDict objectForKey:@"grapes"]]
wineCompanyWeb:[NSURL URLWithString:[aDict objectForKey:@"wine_web"]]
notes:[aDict objectForKey:@"notes"]
rating:[[aDict objectForKey:@"rating"] intValue]
photoURL:[NSURL URLWithString:[aDict objectForKey:@"picture"]]];
}
//Pasar de disccionario a JSON (no lo utilizamos)
-(NSDictionary *)proxyForJSON{
return @{@"name" : self.name,
@"company" : self.wineCompanyName,
@"wine_web" : [self.wineCompanyWeb path], //fix/11a
@"type" : self.type,
@"origin" : self.origin,
@"grapes" : self.grapes,
@"notes" : self.notes,
@"rating" : @(self.rating),
@"picture" : [self.photoURL path]};
}
#pragma mark - Utils
-(NSArray*)extractGrapesFromJSONArray: (NSArray*)JSONArray{
NSMutableArray *grapes = [NSMutableArray arrayWithCapacity:[JSONArray count]];
for (NSDictionary *dict in JSONArray) {
[grapes addObject:[dict objectForKey:@"grape"]];
}
return grapes;
}
-(NSArray *)packGrapesIntoJSONArray{
NSMutableArray *jsonArray = [NSMutableArray arrayWithCapacity:[self.grapes count]];
for (NSString *grape in self.grapes) {
[jsonArray addObject:@{@"grape": grape}];
}
return jsonArray;
}
-(UIImage *) imageFromURLSave: (NSURL *)aURL{
UIImage *image=nil;
NSString *fileNameImage;
NSFileManager *fm= [NSFileManager defaultManager];
NSData *data = nil;
BOOL rc=NO;
NSError *error= nil;
if (aURL==nil){
}else{
//Obtenemos el nombre del fichero de la imagen
fileNameImage=[aURL lastPathComponent];
//Como deuelve un ARRAy obtener su ultimo
NSURL *urlRuta= [[fm URLsForDirectory:NSCachesDirectory
inDomains:NSUserDomainMask] lastObject];
//devuelve una URL incluyendo el fichero en concreto
urlRuta= [urlRuta URLByAppendingPathComponent:fileNameImage];
//Leer el archivo de la cahe con la imagen
data= [ NSData dataWithContentsOfURL:urlRuta options:NSDataReadingMapped error:&error];
//Si no hay nada, obtnemos los dtos y los guardamos
if (data==nil) {
//Error al leer la imagen
NSLog(@"Error al leer la imagen de URL %@ es: %@",fileNameImage, error);
data=[NSData dataWithContentsOfURL:aURL];
rc=[data writeToURL:urlRuta options:NSDataWritingAtomic error:&error];
if (rc==NO){
//Error al grabr la imagen
NSLog(@"Error al grabar la imagen %@ es: %@",fileNameImage, error);
}
}
image= [UIImage imageWithData:data];
}
return image;
}
@end