forked from iFixit/iFixit-iOS
/
iFixitAPI.m
122 lines (88 loc) · 3.5 KB
/
iFixitAPI.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
//
// iFixitAPI.m
// iFixit
//
// Created by David Patierno on 8/6/10.
// Copyright 2010 iFixit. All rights reserved.
//
#import "iFixitAPI.h"
@implementation iFixitAPI
static int volatile openConnections = 0;
/**
* Singleton accessor.
*/
+ (iFixitAPI *)sharedInstance {
static iFixitAPI *sharedInstance;
@synchronized(self) {
if (!sharedInstance)
sharedInstance = [[iFixitAPI alloc] init];
return sharedInstance;
}
return nil;
}
- (void)getGuide:(NSInteger)guideid forObject:(id)object withSelector:(SEL)selector {
NSString *url = [NSString stringWithFormat:@"http://%@/api/0.1/guide/%d", IFIXIT_HOST, guideid];
BGNetRequest *bgnr = [BGNetRequest initWithUrl:url];
[bgnr pushHandler:[MTHandler initForObject:object withSelector:selector]];
[bgnr pushHandler:[MTHandler initForObject:self withSelector:@selector(gotGuide:)]];
[self performSelectorInBackground:@selector(get:) withObject:bgnr];
}
- (void)gotGuide:(BGNetRequest *)bgnr {
NSDictionary *data = [bgnr.data JSONValue];
Guide *guide = data ? [Guide guideWithDictionary:data] : nil;
MTHandler *handler = [bgnr popHandler];
[handler.object performSelector:handler.selector withObject:guide];
}
- (void)getAreas:(NSString *)parent forObject:(id)object withSelector:(SEL)selector {
if (!parent)
parent = @"";
NSString *url = [NSString stringWithFormat:@"http://%@/api/0.1/areas/%@", IFIXIT_HOST, parent];
BGNetRequest *bgnr = [BGNetRequest initWithUrl:url];
[bgnr pushHandler:[MTHandler initForObject:object withSelector:selector]];
[bgnr pushHandler:[MTHandler initForObject:self withSelector:@selector(gotAreas:)]];
[self performSelectorInBackground:@selector(get:) withObject:bgnr];
}
- (void)gotAreas:(BGNetRequest *)bgnr {
NSDictionary *areas = [bgnr.data JSONValue];
MTHandler *handler = [bgnr popHandler];
[handler.object performSelector:handler.selector withObject:areas];
}
- (void)getGuides:(NSString *)type forObject:(id)object withSelector:(SEL)selector {
if (!type)
type = @"featured";
NSString *url = [NSString stringWithFormat:@"http://%@/api/0.1/guides/%@?limit=9", IFIXIT_HOST, type];
BGNetRequest *bgnr = [BGNetRequest initWithUrl:url];
[bgnr pushHandler:[MTHandler initForObject:object withSelector:selector]];
[bgnr pushHandler:[MTHandler initForObject:self withSelector:@selector(gotGuides:)]];
[self performSelectorInBackground:@selector(get:) withObject:bgnr];
}
- (void)gotGuides:(BGNetRequest *)bgnr {
NSArray *guides = [bgnr.data JSONValue];
MTHandler *handler = [bgnr popHandler];
[handler.object performSelector:handler.selector withObject:guides];
}
/**
* Background handler for HTTP GET requests.
*/
- (void)get:(BGNetRequest *)bgnr {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
openConnections++;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:bgnr.url]];
NSError *err = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil
error:&err];
[request release];
MTHandler *handler = [bgnr popHandler];
bgnr.data = err ? nil : [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
[handler.object performSelectorOnMainThread:handler.selector withObject:bgnr waitUntilDone:NO];
if (--openConnections <= 0) {
openConnections = 0;
app.networkActivityIndicatorVisible = NO;
}
[pool drain];
}
@end