2012-07-08 6 views
0

사용자가 캔버스에 점을 설정하는 그리기 앱의 종류를 개발 중입니다. 그려지는 것은 NSManagedObjects로 저장됩니다. 사용자가 버튼을 눌러 마지막 드로잉 제스처를 실행 취소 할 수 있도록 실행 취소 관리자도 활성화했습니다.핵심 데이터 삭제 배경 스레드 삭제 취소

모두 예상대로 작동합니다.

그런 다음 캔버스 (캔버스 지우기)의 모든 항목을 삭제하는 버튼이 있습니다. 눌렀을 때 백그라운드 스레드에서 삭제 작업을하는 데 시간이 걸릴 수 있으며 진행률 표시 줄을 표시하려고합니다. 그런 다음 백그라운드 스레드의 모델 객체 컨텍스트를 주 스레드의 컨텍스트와 병합합니다. 이것은 잘 작동합니다.

하지만 사용자가 실행 취소 버튼을 한 번만 누르면 전체 삭제 작업을 실행 취소 할 수 있기를 바랍니다. 이것이 내가 할 수없는 일이다. 멀티 스레딩의 경우

나는이 자습서 다음 해요 : 내가이 (가 있지만, 한 번 일을 두 개의 스레드의 병합 이상 취소 할 수없는 것 같다 http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

을, 나는 이유를 모르겠어). 실행 취소 그룹에서 모든 것을 중첩해야하는지 여부를 모릅니다. 나는 노력했지만 여전히 운이 없다.

+1

나는 당신이 그것을 언두 그룹에 랩핑하고 -undoNestedGroup을 사용하여 할 수 있어야한다고 생각한다. 나는 그것을 테스트하지 않았지만 테스트를해야하는지 잘 알고 싶습니다. – svena

+0

그래, 그게 내가 시도하는거야,하지만 작동하지 않습니다, 그것은 병합하기 전에 상태로 실행 취소하지 않습니다. – Odrakir

+1

병합 자체가 실행 취소 그룹 안에 있습니까 아니면 백그라운드 작업입니까? – svena

답변

1

중첩 된 실행 취소 그룹으로 할 수 있다고 생각합니다. 당신의 작업을 감싸고

-(void)beginUndoGrouping; 
-(void)endUndoGrouping; 

사이를 병합 ... 그리고 취소 -(void)undoNestedGroup를 사용 .

+0

그게 속임수 였어요. 내가 한 것은 beginUndoGrouping과 endUndoGrouping 사이의 중첩 작업 (mergeChangesFromContextDidSaveNotification)뿐이었습니다. 이제는 내가 항상 병합을 취소 할 수있는 다른 스레드에서 내가하는 일은 중요하지 않습니다. – Odrakir