Skip to content

Commit 9a7920f

Browse files
committed
Better error propagation in resolving localIds
1 parent c59c775 commit 9a7920f

File tree

1 file changed

+31
-36
lines changed

1 file changed

+31
-36
lines changed

Parse/Parse/Internal/Commands/PFRESTCommand.m

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -174,68 +174,72 @@ - (void)maybeChangeServerOperation {
174174
}
175175
}
176176

177-
+ (BOOL)forEachLocalIdIn:(id)object doBlock:(BOOL(^)(PFObject *pointer, NSError **error))block error:(NSError **)error {
178-
__block BOOL modified = NO;
177+
+ (BOOL)forEachLocalIdIn:(id)object
178+
doBlock:(BOOL(^)(PFObject *pointer, BOOL *modified, NSError **error))block
179+
modified:(BOOL *)modified error:(NSError **)error {
179180

180181
// If this is a Pointer with a local id, try to resolve it.
181182
if ([object isKindOfClass:[PFObject class]] && !((PFObject *)object).objectId) {
182-
return block(object, error);
183+
__block BOOL blockModified = NO;
184+
BOOL success = block(object, &blockModified, error);
185+
if (blockModified) {
186+
*modified = YES;
187+
}
188+
return success;
183189
}
184190

185191
if ([object isKindOfClass:[NSDictionary class]]) {
186192
__block NSError *localError;
187193
__block BOOL hasFailed = NO;
188194
[object enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
189-
if ([[self class] forEachLocalIdIn:obj doBlock:block error:&localError]) {
190-
modified = YES;
191-
}
192-
if (localError) {
195+
if (![[self class] forEachLocalIdIn:obj doBlock:block modified:modified error:&localError]) {
193196
*stop = YES;
194197
hasFailed = YES;
195198
}
196199
}];
197200
if (hasFailed && error) {
198201
*error = localError;
202+
return NO;
199203
}
200204
} else if ([object isKindOfClass:[NSArray class]]) {
201205
for (id value in object) {
202-
if ([[self class] forEachLocalIdIn:value doBlock:block error:error]) {
203-
modified = YES;
206+
if (![[self class] forEachLocalIdIn:value doBlock:block modified:modified error:error]) {
207+
return NO;
204208
}
205209
}
206210
} else if ([object isKindOfClass:[PFAddOperation class]]) {
207211
for (id value in ((PFAddOperation *)object).objects) {
208-
if ([[self class] forEachLocalIdIn:value doBlock:block error:error]) {
209-
modified = YES;
212+
if (![[self class] forEachLocalIdIn:value doBlock:block modified:modified error:error]) {
213+
return NO;
210214
}
211215
}
212216
} else if ([object isKindOfClass:[PFAddUniqueOperation class]]) {
213217
for (id value in ((PFAddUniqueOperation *)object).objects) {
214-
if ([[self class] forEachLocalIdIn:value doBlock:block error:error]) {
215-
modified = YES;
218+
if (![[self class] forEachLocalIdIn:value doBlock:block modified:modified error:error]) {
219+
return NO;
216220
}
217221
}
218222
} else if ([object isKindOfClass:[PFRemoveOperation class]]) {
219223
for (id value in ((PFRemoveOperation *)object).objects) {
220-
if ([[self class] forEachLocalIdIn:value doBlock:block error:error]) {
221-
modified = YES;
224+
if (![[self class] forEachLocalIdIn:value doBlock:block modified:modified error:error]) {
225+
return NO;
222226
}
223227
}
224228
}
225-
226-
return modified;
229+
return YES;
227230
}
228231

229-
- (BOOL)forEachLocalId:(BOOL(^)(PFObject *pointer, NSError **error))block error:(NSError **)error {
232+
- (BOOL)forEachLocalId:(BOOL(^)(PFObject *pointer, BOOL *modified, NSError **error))block error:(NSError **)error {
230233
NSDictionary *data = [[PFDecoder objectDecoder] decodeObject:self.parameters];
231234
if (!data) {
232235
return YES;
233236
}
234-
235-
if ([[self class] forEachLocalIdIn:data doBlock:block error:error]) {
236-
if (error && *error) {
237-
return NO;
238-
}
237+
BOOL modified = NO;
238+
BOOL success = [[self class] forEachLocalIdIn:data doBlock:block modified:&modified error:error];
239+
if (!success) {
240+
return NO;
241+
}
242+
if (success) {
239243
self.parameters = [[PFPointerOrLocalIdObjectEncoder objectEncoder] encodeObject:data error:error];
240244
if (!self.parameters && error && *error) {
241245
return NO;
@@ -245,27 +249,18 @@ - (BOOL)forEachLocalId:(BOOL(^)(PFObject *pointer, NSError **error))block error:
245249
}
246250

247251
- (BOOL)resolveLocalIds:(NSError * __autoreleasing *)error {
248-
__block NSError *firstError;
249-
__block BOOL pointerResolutionFailed = NO;
250-
BOOL paramEncodingSucceeded = [self forEachLocalId:^(PFObject *pointer, NSError **error) {
252+
BOOL paramEncodingSucceeded = [self forEachLocalId:^(PFObject *pointer, BOOL *modified, NSError **blockError) {
251253
NSError *localError;
252254
BOOL success = [pointer resolveLocalId:&localError];
255+
*modified = YES;
253256
if (!success && localError) {
254-
*error = localError;
255-
pointerResolutionFailed = YES;
256-
if (!firstError) {
257-
firstError = localError;
258-
}
257+
*blockError = localError;
259258
}
260-
return YES;
259+
return success;
261260
} error: error];
262261
if (!paramEncodingSucceeded && *error) {
263262
return NO;
264263
}
265-
if (pointerResolutionFailed && firstError) {
266-
*error = firstError;
267-
return NO;
268-
}
269264
[self maybeChangeServerOperation];
270265
return YES;
271266
}

0 commit comments

Comments
 (0)