을 isFinished의 등록을 취소하고, 내 대기열에 추가하여 작업을 시작합니다 :때의 <code>isFinished</code> 재산의 KVO 관찰에 등록, 내가 작업 서브 클래스의 인스턴스를 생성, 운영의 KVO 관찰이 간단한 코드 (Xcode를 8.3)에서
class MyOperation : Operation {
override func main() {
print("starting")
print("finishing")
}
}
class ViewController: UIViewController {
let q = OperationQueue()
override func viewDidLoad() {
super.viewDidLoad()
let op = MyOperation()
op.addObserver(self, forKeyPath: #keyPath(MyOperation.isFinished), options: [], context: nil)
self.q.addOperation(op)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("Observed \(keyPath)")
if let op = object as? Operation {
op.removeObserver(self, forKeyPath: #keyPath(MyOperation.isFinished))
}
}
}
당신이 볼 수 있듯이, 나는 observeValue(forKeyPath...
의 구현을 가지고 있으며, 내 계획은 removeObserver(forKeyPath...
입니다.
문제는 "키 값 관찰자가 등록되어있는 동안 MyOperation이 할당 취소되었습니다."라는 문제가 앱에 충돌하는 것입니다. 우리는 "시작"과 "마무리"를 인쇄하지만 결코 "관찰 된"인쇄는하지 않습니다. 수술은 전에 존재하지 않는다 나는 내 KVO 알림을 받는다.
이것은 마치 catch 22처럼 보입니다. isFinished
을 관찰하여 관찰자를 제거 할 수 없다면 언제해야합니까? [이 문제를 해결하려면 MyOperation에 main
의 끝에 KVO 관찰 가능 속성을 추가하면됩니다. 그러나 내가 이것을해야한다는 개념은 매우 이상합니다. 이것이 내가 여기까지 노력하고있어 할 수 있도록 isFinished
이 관찰 정확히 왜하지?]
https://developer.apple.com/library/content/technotes/tn2109/_index.html에서 언급 한 문제 일 수 있습니까? - "NSOperation의 isFinished 속성을 관찰하기 위해 KVO (Key-Value Observing)를 사용하면 비슷한 문제가 발생할 수 있습니다 .KVO는 관찰자 또는 관찰자를 보유하지 않지만 사용자가 관찰자를 제거하더라도 -viewWillDisappear : 메서드를 사용하면 KVO 알림이 이미 객체에 표시 될 수 있습니다. 그런 경우 알림을 실행하는 스레드가 할당 취소 된 객체를 호출 할 수 있습니다. " –
@ MartinR이 부분은 '자기'(관찰자)가 존재하지 않을 수도있는 위험에 대해 이야기하고 있으므로 KVO 알림이 존재하지 않는 객체로 전송 될 수 있습니다. 그것은 내 문제의 _opposite_입니다. 내 문제는 내 KVO 알림을 보내지 않고 수술 (observand)이 존재하지 않는다는 것입니다. 'self'는 루트 뷰 컨트롤러이고 어디에도 없습니다. – matt
내가 그것을 시도한 것을 볼 수있는 유용성이 있는가? 'Observed Optional Finishing ("isFinished")'을 끝낼 수 있습니까? 내 응용 프로그램은 * 충돌하지 않습니다 *. 나는 xcode 8.2를 사용하고 있는데, 그게 무슨 뜻인지 이해하기를 바란다. –