2014-10-09 4 views
2

새로운 iOS 8 Today 위젯에 코드를 작성하고 있지만 widgetPerformUpdateWithCompletionHandler:이 호출 될 때마다 (즉, @property에서 생성 된) my ivars가 재설정된다는 사실을 알았습니다. 새보기 컨트롤러가 인스턴스화 될 때마다 마찬가지입니다.오늘 연장판 Ivars가 지속적으로 재설정됩니까?

위젯에 대한 업데이트 (예 : 백그라운드에있는 동안 및 콘텐츠 업데이트를 위해 호출 됨) 사이에 데이터를 메모리에 저장할 수 없습니다.

정상적인 동작입니까, 아니면 버그입니까? 재설정되는 메모리 기반 데이터에 의존하는 대신 간단한 번호를 NSUserDefaults에 저장해야합니까?

+0

저는 이것을 너무 철저히 들여다 보지 않았지만, 확장 된 '생존 프로세스는 짧지 만, 단 하나의 작업을 수행하는 데 절대적으로 필요하지는 않습니다. 예 : [문서의 라이프 사이클 다이어그램] (https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/)을 참조하십시오. TP40014214-CH2-SW2). –

+0

감사합니다. @ JoshCaswell. 나는 그 섹션을 보았지만 다양한 확장 타입에 대해서는 의미가 있지만, 패널이 닫히면 위젯 라이프 사이클이 끝난다는 것이 이상하게 보입니다 (그렇게 일어나는 것처럼 보입니다). 패널이 열릴 때마다 새 위젯이 인스턴스화 된 다음 해당 메소드의 목적을 다시 조사해야합니다. – sidyll

+0

확장자가'widgetPerformUpdateWithCompletionHandler :'를 호출하는 사이에 실행되지 않습니다. iOS가 새 데이터를 가져올 수 있도록 백그라운드에서 확장 프로그램을 실행하면 해당 메소드가 호출됩니다. 그런 다음 OS는 확장 프로그램의 이미지 (완료 핸들러가 제공하는 이미지)를 확장을위한 일종의 "실행 화면"으로 표시합니다 (알림 센터가 시작될 때 확장 프로그램을 사용할 수 없을 때까지 _immediately_). 그것은). 업데이트 된 데이터가 서버에서 오기를 기다리는 동안 캐시 된 데이터를 저장하기 위해 NSUserDefaults를 사용하려고합니다. –

답변

0

widgetPerformUpdateWithCompletionHandler:으로 전화하는 사이에이 실행되지 않을 것입니다. iOS가 새 데이터를 가져올 수 있도록 백그라운드에서 확장 프로그램을 실행하면 해당 메소드가 호출됩니다. 그런 다음 OS는 확장 프로그램의 이미지를 캡처하여 확장을위한 일종의 "시작 화면"으로 표시합니다 (알림 센터가 시작될 때 내선 번호는 ). 이미지가 나타날 때까지). NSUserDefaults (또는 다른 방법)을 사용하여 업데이트 된 데이터가 서버에서 오는 것을 기다리는 동안로드 할 캐시 된 데이터를 저장하려고합니다.

즉, 운영 체제는 주기적으로 앱을 실행하여 새로운 데이터를 가져와 사용자가 항상 알림 센터에서 업데이트 된 데이터를 볼 수있게합니다. 알림 센터에서 시작할 때 확장을 더 빨리로드 할 수 있도록 해당 데이터를이 캐시에 저장해야합니다. 이것에 대해서는 모두 here을 참조하십시오.

+4

정확하지 않습니다. 당신의 확장은 *'''widgetPerformUpdateWithCompletionHandler :'''에 대한 호출 사이에서 계속 실행될 수도 있습니다. UIViewController가 다시 인스턴스화 되었기 때문에 "ivars가 재설정"된 이유는 시스템 상태에 따라 동작이 다를 수 있기 때문입니다. 기본적으로, 당신의 메인 VC에 대한 init 호출이 당신의 확장 기능의 시작과 쌍을 이룰 것이라고 가정하지 마십시오. 출시와 동시에 여러 번 인스턴스화 될 수 있으므로 1 대 1 일 수도 있습니다. 알림 센터가 없어지면 확장 프로그램이 종료 될 수 있지만 그렇지 않을 수 있습니다. –

관련 문제