2012-12-01 2 views
1

나는 핵심 데이터를 가지고있는 문제를 찾아 내려고 노력하고있다. 나는 오류의 의미를 이해하고, 전에 그것을 가지고 있었지만 (그리고 그것을 고쳤습니다.) 그러나 나는 지금 그것을 얻고 있습니다. > MPPlace 및 MPModel - -NSInternalInconsistencyException 재귀 dirtying 혼란

MPModel> MPModel이 NSManagedObject 및 MPPlace 및 MPProject의 서브 클래스입니다

이 MPModel의 서브 클래스는 MPProject :

내 응용 프로그램은 다음과 같은 구조를 가지고 있습니다.

데이터 모델에는 MPPlace와 MPProject간에 MPProject가 있고 MPProject가 MPPlace에 속하는 MPProject와 MPPlace 간의 관계가 있습니다.

응용 프로그램이로드되면 완벽하게 작동하는 여러 MPPlace 객체를 가져옵니다. 사용자가 장소를 선택한 다음 프로젝트 옵션을 선택하면 앱이 프로젝트 목록을 검색하려고 시도합니다. 앱이 다음 오류와 함께, 그러나 실패 곳입니다 각 MPModel가 이미 존재하지 않는 경우 단순히 지속성 저장소에 객체의 배열을 저장 saveAllLocally을 포함하여 사용자 정의 방법의 수를 포함

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'Failed to process pending changes before save. The context is still dirty after 100 
attempts. Typically this recursive dirtying is caused by a bad validation method, 
willSave, or notification handler.' 

하고, loadNestedResources - 현재 객체와 관련된 새 객체를 서버에서 가져옵니다. 나는 실패가 loadNestedResources 메소드로 발생하고있는 것을 발견하고 있는데, 왜 그 이유를 알 수는 없다.

loadNestedResources 방법은 다음과 같습니다

- (void) loadNestedResourcesOfType:(Class)type atURL:(NSString *)resURL withBlock:(MPFindObjectsBlock)block 
{ 
    if (![type isSubclassOfClass:[MPModel class]]) { 
     block(nil, nil); 
    } else { 
      NSString *url = [NSString stringWithFormat:@"%@%@/%@%@", kMP_BASE_API_URL, [self.class baseURL], self.objID, [type baseURL]]; 
     MPRequest *request = [[MPRequest alloc] initWithURL:url]; 

     // Attempt to see if we already have this relation 
      NSString *relation = [[MPUtils stripClassName:type].lowercaseString stringByAppendingString:@"s"]; 
     NSSet *relatedObjects = [self valueForKey:relation]; 

     if (relatedObjects && relatedObjects.count > 0) { 
      // We have some objects so lets exclude these from our request 
      NSMutableArray *uuids = [NSMutableArray arrayWithCapacity:0]; 
      for (MPModel *obj in relatedObjects) { 
       [uuids addObject:obj.uuid]; 
      } 

      [request setParam:[uuids componentsJoinedByString:@";"] forKey:@"exclude_uuids"]; 
     } 

     [MPUser signRequest:request]; 
     [request setRequestMethod:@"POST"]; 
     [request submit:^(MPResponse *resp, NSError *error) { 
      if (error) { 
       if (relatedObjects.count > 0) { 
        block([relatedObjects allObjects], nil); 
       } else { 
        block(nil, error); 
       } 
      } else { 
       // Combine all of our objects 
       NSMutableArray *allObjects = [[type createListWithResponse:resp] mutableCopy]; 
       if (allObjects.count > 0) { 
        [allObjects addObjectsFromArray:[relatedObjects allObjects]]; 

        // Make sure they're now all saved in the persistence store 
        NSArray *savedObjects = [MPModel saveAllLocally:allObjects forEntityName:NSStringFromClass(type)]; 
        for (NSObject *obj in savedObjects) { 
         [obj setValue:self forKey:[MPUtils stripClassName:self.class].lowercaseString]; 
        } 

        // Set them as our related objects for this relationship 
        [self setValue:[NSSet setWithArray:savedObjects] forKey:relation]; 

        [MPModel saveAllLocally:savedObjects forEntityName:NSStringFromClass(type)]; 
        block(allObjects, nil); 
       } else { 
        block([relatedObjects allObjects], nil); 
       } 
      } 

     }]; 
    } 
} 

방법은 바로 내가 오류를 얻을 수있는 곳입니다 saveAllLocally에 두 번째 호출 될 때까지 완벽하게 실행됩니다. 의 _updatedAtSet 변수가 true로 설정되어있는 경우가 더 이상 값을 설정하지 않아야으로 내가 무엇을 수집 할 수 있습니다에서

- (void) willSave 
{ 
    NSDate *now = [NSDate date]; 

    if (!self.updated_at) { 
     self.updated_at = now; 
    } 

    if (!self.created_at) { 
     self.created_at = now; 
    } 

    if (!self.uuid) { 
     self.uuid = [self createUUID]; 
    } 

    if (!self.last_sync) { 
     self.last_sync = now; 
    } 

    if ([self isUpdated] && self.changedValues.count > 0) { 

     if (!self.attribute_updated_at) { 
      NSDictionary *attributes = [self.entity attributesByName]; 
      NSMutableDictionary *dates = [NSMutableDictionary dictionaryWithCapacity:0]; 
      for (NSString *attr in attributes.allKeys) { 
       [dates setObject:now forKey:attr]; 
      } 

      [self setAttributeUpdatedDates:dates]; 
     } 

     if (_updatedAtSet) { 
      _updatedAtSet = NO; 
     } else { 
      if ([self.changedValues.allKeys containsObject:@"last_sync"]) { 
       self.updated_at = [self.changedValues objectForKey:@"last_sync"]; 
      } else { 
       self.updated_at = [NSDate date]; 
      } 

         _updatedAtSet = YES; 
       NSDictionary *changed = [self changedValues]; 
      NSMutableDictionary *dates = [[self attributeUpdatedDates] mutableCopy]; 

      for (NSString *key in changed.allKeys) { 
       [dates setObject:now forKey:key]; 
      } 

      [self setAttributeUpdatedDates:dates]; 
     } 

    } 
} 

는,이 괜찮을 다음 MPModel 클래스는 다음과 같은 한 willSave 방법을 사용 그러나 그것은 아직도 끊고 있고, 나는 이유를 이해할 수 없다!

은 누군가가 나에게 그것을 해결 한 감사

답변

0

을 도울 수 바랍니다.

지금 방금 위치가 아닌 didSave 메서드로 _updatedAtSet = NO;을 옮겼습니다. 이제 제대로 작동합니다. 어쨌든 고마워요