forked from btedev/iphone_barcamp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Talk.m
153 lines (125 loc) · 5.05 KB
/
Talk.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
//
// Talk.m
// BarCamp
//
// Created by Barry Ezell on 9/11/10.
// Copyright 2010 Dockmarket LLC. All rights reserved.
//
#import "Talk.h"
#import "BarCampAppDelegate.h"
#import "CJSONDeserializer.h"
@implementation Talk
@dynamic roomName;
@dynamic roomId;
@dynamic speaker;
@dynamic endTime;
@dynamic interestLevel;
@dynamic notes;
@dynamic title;
@dynamic day;
@dynamic startTime;
@dynamic serverId;
@dynamic updatedAt;
+ (void)refreshTalks {
BarCampAppDelegate *delegate = (BarCampAppDelegate *) [[UIApplication sharedApplication] delegate];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@/%@",delegate.baseUrlStr,@"talks.json"]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}
+ (void)requestFinished:(ASIHTTPRequest *)request {
NSManagedObjectContext *context = [NSManagedObjectContext defaultContext];
NSString *responseString = [request responseString];
//DLog(@"%@",responseString);
NSData *jsonData = [responseString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
NSError *error = nil;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
NSDictionary *dictionary = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
if ([dictionary objectForKey:@"talks"]) {
NSArray *talks = [dictionary objectForKey:@"talks"];
for (NSDictionary *talk in talks) {
NSDictionary *innerDict = [talk valueForKey:@"talk"];
BOOL isDeleted = ([innerDict objectForKey:@"deleted_at"] == [NSNull null] ? NO : YES);
//check for existing talk with same serverId
NSNumber *serverId = [innerDict objectForKey:@"id"];
Talk *tLocal = [Talk findFirstByAttribute:@"serverId" withValue:serverId];
//three conditions on which we'll act
//1. Talk that's not present in CD and is not deleted on the server (create)
//2. Talk that's present and deleted on the server (delete)
//3. Talk that's present in CD and was updated before the server object (update)
if (!tLocal && !isDeleted) {
@try {
[Talk createInstance:innerDict];
}
@catch (NSException * e) {
DLog(@"Error creating talk: %@",innerDict);
}
} else if (tLocal && isDeleted) {
//delete local file
DLog(@"Deleting local talk %@ to reflect server delete",tLocal.title);
[context deleteObject:tLocal];
} else if (tLocal) {
//compare updatedAt values and possibly update
NSDate *serverUpdated = [formatter dateFromString:[innerDict objectForKey:@"updated_at"]];
//TODO: fix this awful TZ hack
//some issues: formatter won't work as is if Rails is set to use a non-UTC TZ,
//this hack assumes the server is two hours ahead of the phone even though they both insist they're "GMT" #fml
NSTimeInterval secondsInFourHours = -4 * 60 * 60;
serverUpdated = [serverUpdated dateByAddingTimeInterval:secondsInFourHours];
if ([tLocal.updatedAt compare:serverUpdated] == NSOrderedAscending) {
DLog(@"Updating local talk with updateAt: %@ to match server talk with updatedAt: %@",tLocal.updatedAt,serverUpdated);
[tLocal populateFromDictionary:innerDict];
}
}
}//talks loop
}//json sanity test
if ([context hasChanges]) {
if(![context save:&error]) {
DLog(@"Failed to save talk to data store: %@", [error localizedDescription]);
}
}
[formatter release];
}
+ (void)requestFailed:(ASIHTTPRequest *)request {
NSError *error = [request error];
DLog(@"Talk request failed: %@",[error localizedDescription]);
}
//Create Talk instance from a NSDictionary
+ (Talk *)createInstance:(NSDictionary *)dict {
DLog(@"Adding talk %@",[dict objectForKey:@"name"]);
Talk *talk = [NSEntityDescription insertNewObjectForEntityForName:@"Talk"
inManagedObjectContext:[NSManagedObjectContext defaultContext]];
[talk populateFromDictionary:dict];
return talk;
}
//populate attributes from a dictionary
- (void)populateFromDictionary:(NSDictionary *)dict {
self.serverId = [dict objectForKey:@"id"];
self.title = [dict objectForKey:@"name"];
if ([dict objectForKey:@"room_id"] != [NSNull null]) {
self.roomId = [dict objectForKey:@"room_id"];
}
if ([dict objectForKey:@"room_name"] != [NSNull null]) {
self.roomName = [dict objectForKey:@"room_name"];
}
if ([dict objectForKey:@"who"] != [NSNull null]) {
self.speaker = [dict objectForKey:@"who"];
}
NSDateFormatter *fmtLong = [[NSDateFormatter alloc] init];
[fmtLong setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
NSDateFormatter *fmtShort =[[NSDateFormatter alloc] init];
[fmtShort setDateFormat:@"yyyy-MM-dd"];
NSString *dayStr = [dict objectForKey:@"day"];
self.day = [fmtShort dateFromString:dayStr];
NSString *sTime = [dict objectForKey:@"start_time"];
self.startTime = [fmtLong dateFromString:sTime];
if ([dict objectForKey:@"end_time"] != [NSNull null]) {
NSString *eTime = [dict objectForKey:@"end_time"];
self.endTime = [fmtLong dateFromString:eTime];
}
[fmtLong release];
[fmtShort release];
self.updatedAt = [NSDate date];
}
@end