2014-05-23 1 views
1

select 문을 취소하거나 중지 할 수 있는지 궁금한가요?초소형 SELECT 문을 중지/중단 할 수 있습니까?

나는 수액이 인 ultralite 데이터베이스이있는 응용 프로그램을 가지고 있습니다. 데이터베이스 연결 및 명령문은 싱글 톤 내에서 처리됩니다.

나는 백그라운드에서 무거운 READ 수술을 시작하는 경우가 있는데, 때로는 2-3 초가 걸리는 ViewController입니다. ViewController에서 일부 값을 변경하고 WRITE -operation으로 저장하면 ViewController가 취소됩니다.

내 문제는 내가 정말 빨리 해요 경우, 및/또는하여 WRITE 작업이 READ -operation의 끝에 기다리고 있기 때문에 READ -operation 아주 천천히, 내의 ViewController가 기각되지 않습니다. 따라서 UI는 몇 초 동안 정지합니다.

내 Google 검색 기술 덕분에 또는 가난한 ultralite 설명서, 아무도 알지, 현재 진행중인 SELECT - 문법을 취소 할 수 있습니까? (보기가 종료되므로 더 이상 결과가 중요하지 않음) 또는 을 동시에 여러 번 허용 할 수 있습니까? 그 중요한 경우 READWRITE 작업은 서로 다른 테이블 작업

편집 : (질문 요약)

  1. 울트라과 동시에 READWRITE 할 수 있습니까?
  2. 그렇지 않은 경우 다른 해결책이 있습니까? 글쎄, 우리가 해결 방법을 발견,하지만이 질문에 대답하지 않습니다

UPDATE (상세)가 (이 순간 우리는 데이터베이스를 복제하는 테스트).

우리는 ShoppingCardListView의 애플리케이션을 보유하고 있습니다 (항목은 초 광속 db에 저장 됨). 이보기에서 Freeform-ViewController 내에서 통계 데이터을 표시하는 항목 (배송일 변경, 금액 수 ...)을 변경할 수 있습니다.

이 통계는 무거운 READ 작업이며, 때로는 최대 5 초가 소요됩니다. 예를 들어 항목 수를 변경하고 DONE 버튼을 누르면 Freeform-ViewControllerWRITE- 작동 (UPDATE)을 시작하고 닫히고 ShoppingCard는 다시 데이터베이스을 얻기 위해 READ으로 업데이트됩니다.

마지막 포인트는 좋지 않지만 우리는 READ 데이터베이스의 전체 쇼핑 카드 대신 하나의 항목 만 업데이트하는 FreeformVC의 완료 핸들러를 구현했습니다. 이것은 효과가있는 것 같지만, 최선의 해결책은 아닙니다. 정말 빨리 클릭하면 데이터베이스에서 다시 읽으려는 경우 지연이 느껴질 수 있으므로 질문이 남아 있습니다 ....모든

+1

백그라운드 대기열에 읽기/쓰기 작업을 넣으면 UI가 응답을 유지할 수 있습니다. 그랜드 센트럴 디스패치 (백그라운드 대기열에'dispatch_async'를 쓰고 읽기/쓰기가 완료되면 메인 대기열로 돌아 가기) 나 NSOperationQueue를 사용할 수 있습니다. 데이터베이스 클래스가 스레드로부터 안전한지 확인하십시오. –

+0

@AaronBrager : 읽기/쓰기 작업이 백그라운드에 있습니다. 'READ'가 너무 오래 걸리면 문제가 발생하므로 두 번째 WRITE 문은 첫 번째 문항이 준비 될 때까지 기다려야한다. ( longilong

+0

WRITE 문이있는 경우 배경을 지정하면 UI가 멈추지 않아야합니다. 주 스레드를 차단하는 것은 무엇입니까? –

답변

0

먼저 (이 좋습니다)

솔루션은 다른 큐에 데이터베이스 쿼리 코드를 이동 : 데이터베이스 작업을 대기 시작합니다. 이 솔루션은 트릭은 쓰기 작업이 솔루션은 읽기 작업을 취소하지 않습니다

 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    // Write operation 
    // .... 
}); 

같은 일을 할 다른 큐이 후

 
// Your read operation 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     // Query here 
     // .... 
     // Move back to Main queue 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Update UI 
     }); 
    }); 

에 데이터베이스 쿼리를 파견하지만, 매우 간단합니다 UI가 더 이상 멈추지 않을 것입니다 (ViewController가 종료되지만 작업이 끝날 때까지 계속 실행됩니다).

다른 가능한 방법 : ultralite 데이터베이스로 문서화되지 않은 ... 가능한 방법 중 하나는 관리자 인스턴스를 파괴하고 (비 - 싱글 톤으로 귀하의 싱글 톤 클래스를 수정하는 것입니다), 이것이 충돌하지 않으면, 실행중인 작업을 취소합니다.

또 다른 가능한 방법 : NSOperations를 사용하고 작업 취소를 시도하십시오 ... 어쩌면 "ultralite"가 취소 상태를 확인하고 쿼리를 중지합니다.

관련 문제