-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAutoDownloadImageView.m
158 lines (124 loc) · 4.05 KB
/
AutoDownloadImageView.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
//
// AutoDownloadImageView.m
// ImageViewAutoDownload
//
// Created by Ignazio Calò on 10/1/11.
// Copyright 2011 Ignazio Calò. All rights reserved.
//
#import "AutoDownloadImageView.h"
@implementation AutoDownloadImageView
@synthesize receivedData;
@synthesize delegate;
-(id)initWithFrame:(CGRect)frame
URL:(NSURL *)url
persistency:(BOOL)persist
forceDownload:(BOOL)force
{
self = [super initWithFrame:frame];
if (self) {
imageURL = [url retain];
persistency = persist;
forceDownload = force;
/**
* Imposto la proprietà image usanto una immagine
* placeholder.
* Questo approccio è migliorabile, generando una view a runtime al posto di una
* jpg
*/
self.image = [UIImage imageNamed:@"unavailable_image.jpeg"];
filename = [[url lastPathComponent] retain];
[self startDownload];
}
return self;
}
-(void)startDownload {
/**
* Se non devo necessariamente scaricare provo a verificare
* se il file è già stato scaricato sul filesystem
*/
if (! forceDownload) {
NSString *documentsPath =
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *fileFullPath = [documentsPath stringByAppendingPathComponent:filename];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:fileFullPath]) {
[self setImage:[UIImage imageWithContentsOfFile:fileFullPath]];
NSLog(@"Image loaded from disk");
return;
}
}
/**
* creo la connessione per il download dell'immagine
*/
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:imageURL];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
[conn scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[conn start];
if (conn) {
NSMutableData *data = [[NSMutableData alloc] init];
self.receivedData = data;
[data release];
}
else {
NSError *error = [NSError errorWithDomain:AutoDownloadImageViewErrorDomain
code:AutoDownloadImageViewErrorNoConnection
userInfo:nil];
/**
* Invio al delegate il messaggio che il download non è andato a buon fine.
*/
if ([self.delegate respondsToSelector:@selector(autoDownload:didFailWithError:)])
[delegate autoDownload:self didFailWithError:error];
}
[req release];
}
-(void)dealloc {
[imageURL release];
[filename release];
[super dealloc];
}
#pragma mark -
#pragma mark NSURLConnection Callbacks
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[receivedData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
{
[connection release];
/**
* Invio al delegate il messaggio che il download non è andato a buon fine.
*/
if ([delegate respondsToSelector:@selector(autoDownload:didFailWithError:)])
[delegate autoDownload:self didFailWithError:error];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
/**
* Imposto la proprietà image con l'immagine scaricata da internet
* questo spesso è sufficiente affinché venga visualizzata
* l'immagine corretta, se così non fosse il delegate dovrà invocare un setNeedDisplay
*/
self.image = [UIImage imageWithData:receivedData];
/**
* Salvo l'immagine nel filesystem se è stato specificato.
*/
if (persistency) {
NSString *documentsPath =
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *dbFullPath = [documentsPath stringByAppendingPathComponent:filename];
[receivedData writeToFile:dbFullPath atomically:YES];
}
/**
* Invio al delegate il messaggio che il download è stato completato.
*/
if ([delegate respondsToSelector:@selector(autoDownloadImageViewFinishDownloading:)])
[delegate autoDownloadImageViewFinishDownloading:self];
[connection release];
self.receivedData = nil;
}
@end