@@ -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