@@ -174,41 +174,50 @@ - (void)maybeChangeServerOperation {
174
174
}
175
175
}
176
176
177
- + (BOOL )forEachLocalIdIn : (id )object doBlock : (BOOL (^)(PFObject *pointer))block {
177
+ + (BOOL )forEachLocalIdIn : (id )object doBlock : (BOOL (^)(PFObject *pointer, NSError **error ))block error : ( NSError **) error {
178
178
__block BOOL modified = NO ;
179
179
180
180
// If this is a Pointer with a local id, try to resolve it.
181
181
if ([object isKindOfClass: [PFObject class ]] && !((PFObject *)object).objectId ) {
182
- return block (object);
182
+ return block (object, error );
183
183
}
184
184
185
185
if ([object isKindOfClass: [NSDictionary class ]]) {
186
+ __block NSError *localError;
187
+ __block BOOL hasFailed = NO ;
186
188
[object enumerateKeysAndObjectsUsingBlock: ^(NSString *key, id obj, BOOL *stop) {
187
- if ([[self class ] forEachLocalIdIn: obj doBlock: block]) {
189
+ if ([[self class ] forEachLocalIdIn: obj doBlock: block error: &localError ]) {
188
190
modified = YES ;
189
191
}
192
+ if (localError) {
193
+ *stop = YES ;
194
+ hasFailed = YES ;
195
+ }
190
196
}];
197
+ if (hasFailed && error) {
198
+ *error = localError;
199
+ }
191
200
} else if ([object isKindOfClass: [NSArray class ]]) {
192
201
for (id value in object) {
193
- if ([[self class ] forEachLocalIdIn: value doBlock: block]) {
202
+ if ([[self class ] forEachLocalIdIn: value doBlock: block error: error ]) {
194
203
modified = YES ;
195
204
}
196
205
}
197
206
} else if ([object isKindOfClass: [PFAddOperation class ]]) {
198
207
for (id value in ((PFAddOperation *)object).objects ) {
199
- if ([[self class ] forEachLocalIdIn: value doBlock: block]) {
208
+ if ([[self class ] forEachLocalIdIn: value doBlock: block error: error ]) {
200
209
modified = YES ;
201
210
}
202
211
}
203
212
} else if ([object isKindOfClass: [PFAddUniqueOperation class ]]) {
204
213
for (id value in ((PFAddUniqueOperation *)object).objects ) {
205
- if ([[self class ] forEachLocalIdIn: value doBlock: block]) {
214
+ if ([[self class ] forEachLocalIdIn: value doBlock: block error: error ]) {
206
215
modified = YES ;
207
216
}
208
217
}
209
218
} else if ([object isKindOfClass: [PFRemoveOperation class ]]) {
210
219
for (id value in ((PFRemoveOperation *)object).objects ) {
211
- if ([[self class ] forEachLocalIdIn: value doBlock: block]) {
220
+ if ([[self class ] forEachLocalIdIn: value doBlock: block error: error ]) {
212
221
modified = YES ;
213
222
}
214
223
}
@@ -217,13 +226,16 @@ + (BOOL)forEachLocalIdIn:(id)object doBlock:(BOOL(^)(PFObject *pointer))block {
217
226
return modified;
218
227
}
219
228
220
- - (BOOL )forEachLocalId : (BOOL (^)(PFObject *pointer))block error : (NSError **)error {
229
+ - (BOOL )forEachLocalId : (BOOL (^)(PFObject *pointer, NSError **error ))block error : (NSError **)error {
221
230
NSDictionary *data = [[PFDecoder objectDecoder ] decodeObject: self .parameters];
222
231
if (!data) {
223
232
return YES ;
224
233
}
225
234
226
- if ([[self class ] forEachLocalIdIn: data doBlock: block]) {
235
+ if ([[self class ] forEachLocalIdIn: data doBlock: block error: error]) {
236
+ if (error && *error) {
237
+ return NO ;
238
+ }
227
239
self.parameters = [[PFPointerOrLocalIdObjectEncoder objectEncoder ] encodeObject: data error: error];
228
240
if (!self.parameters && error && *error) {
229
241
return NO ;
@@ -235,16 +247,19 @@ - (BOOL)forEachLocalId:(BOOL(^)(PFObject *pointer))block error:(NSError **)error
235
247
- (BOOL )resolveLocalIds : (NSError * __autoreleasing *)error {
236
248
__block NSError *firstError;
237
249
__block BOOL pointerResolutionFailed = NO ;
238
- BOOL paramEncodingFailed = [self forEachLocalId: ^(PFObject *pointer) {
250
+ BOOL paramEncodingSucceeded = [self forEachLocalId: ^(PFObject *pointer, NSError **error ) {
239
251
NSError *localError;
240
252
BOOL success = [pointer resolveLocalId: &localError];
241
- if (!success && !firstError ) {
242
- firstError = localError;
253
+ if (!success && localError ) {
254
+ *error = localError;
243
255
pointerResolutionFailed = YES ;
256
+ if (!firstError) {
257
+ firstError = localError;
258
+ }
244
259
}
245
260
return YES ;
246
261
} error: error];
247
- if (paramEncodingFailed && *error) {
262
+ if (!paramEncodingSucceeded && *error) {
248
263
return NO ;
249
264
}
250
265
if (pointerResolutionFailed && firstError) {
0 commit comments