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
|
//
// AbstractNetworkOperation.m
// iSub
//
// Created by Aaron Brethorst on 5/12/11.
// Copyright 2011 Canonical. All rights reserved.
//
#import "AbstractNetworkOperation.h"
#import "UONetworkStatusCoordinator.h"
@interface AbstractNetworkOperation ()
- (void)finish;
@end
@implementation AbstractNetworkOperation
@synthesize url = _url;
@synthesize statusCode = _statusCode;
@synthesize error = _error;
@synthesize isExecuting = _isExecuting;
@synthesize isFinished = _isFinished;
- (id)initWithUrl:(NSURL *)url
{
self = [super init];
if (self == nil)
return nil;
_url = [url copy];
_isExecuting = NO;
_isFinished = NO;
return self;
}
- (void)dealloc
{
[_url release];
[_connection release];
[_error release];
[super dealloc];
}
- (BOOL)isConcurrent
{
return YES;
}
- (void)start
{
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
return;
}
NSLog(@"operation for <%@> started.", _url);
[self willChangeValueForKey:@"isExecuting"];
_isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];
NSURLRequest * request = [NSURLRequest requestWithURL:_url];
_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[UONetworkStatusCoordinator addNetworkActivity];
if (nil == _connection)
{
[self finish];
}
}
- (void)finish
{
NSLog(@"operation for <%@> finished. "
@"status code: %d, error: %@",
_url, _statusCode, _error);
[UONetworkStatusCoordinator removeNetworkActivity];
[_connection release];
_connection = nil;
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
_isExecuting = NO;
_isFinished = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}
#pragma mark -
#pragma mark NSURLConnection delegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
_statusCode = [httpResponse statusCode];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//no-op, subclasses must implement this.
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[self finish];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
_error = [error copy];
[self finish];
}
@end
|