@@ -174,68 +174,72 @@ - (void)maybeChangeServerOperation {
174
174
}
175
175
}
176
176
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 {
179
180
180
181
// If this is a Pointer with a local id, try to resolve it.
181
182
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;
183
189
}
184
190
185
191
if ([object isKindOfClass: [NSDictionary class ]]) {
186
192
__block NSError *localError;
187
193
__block BOOL hasFailed = NO ;
188
194
[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]) {
193
196
*stop = YES ;
194
197
hasFailed = YES ;
195
198
}
196
199
}];
197
200
if (hasFailed && error) {
198
201
*error = localError;
202
+ return NO ;
199
203
}
200
204
} else if ([object isKindOfClass: [NSArray class ]]) {
201
205
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 ;
204
208
}
205
209
}
206
210
} else if ([object isKindOfClass: [PFAddOperation class ]]) {
207
211
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 ;
210
214
}
211
215
}
212
216
} else if ([object isKindOfClass: [PFAddUniqueOperation class ]]) {
213
217
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 ;
216
220
}
217
221
}
218
222
} else if ([object isKindOfClass: [PFRemoveOperation class ]]) {
219
223
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 ;
222
226
}
223
227
}
224
228
}
225
-
226
- return modified;
229
+ return YES ;
227
230
}
228
231
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 {
230
233
NSDictionary *data = [[PFDecoder objectDecoder ] decodeObject: self .parameters];
231
234
if (!data) {
232
235
return YES ;
233
236
}
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) {
239
243
self.parameters = [[PFPointerOrLocalIdObjectEncoder objectEncoder ] encodeObject: data error: error];
240
244
if (!self.parameters && error && *error) {
241
245
return NO ;
@@ -245,27 +249,18 @@ - (BOOL)forEachLocalId:(BOOL(^)(PFObject *pointer, NSError **error))block error:
245
249
}
246
250
247
251
- (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) {
251
253
NSError *localError;
252
254
BOOL success = [pointer resolveLocalId: &localError];
255
+ *modified = YES ;
253
256
if (!success && localError) {
254
- *error = localError;
255
- pointerResolutionFailed = YES ;
256
- if (!firstError) {
257
- firstError = localError;
258
- }
257
+ *blockError = localError;
259
258
}
260
- return YES ;
259
+ return success ;
261
260
} error: error];
262
261
if (!paramEncodingSucceeded && *error) {
263
262
return NO ;
264
263
}
265
- if (pointerResolutionFailed && firstError) {
266
- *error = firstError;
267
- return NO ;
268
- }
269
264
[self maybeChangeServerOperation ];
270
265
return YES ;
271
266
}
0 commit comments