오늘의 위젯에서 "myApp에 허용 된 시간 이후의 활성 단정이 있습니다."라는 가끔 충돌이 발생합니다. 일부 검색 후, 내가 부적절하게 백그라운드 작업을 처리하기 때문에 그것이 발생했다고 생각합니다.ios에 "허용 시간을 초과하는 활성 단정이 있습니다."비동기 작업으로 인해 충돌이 발생합니다.
두 가지 유형의 백그라운드 작업을 사용합니다. dispatch_async 및 NSURLConnection. 나는 초보자이며 어느 것이 문제인지 파악할 수 없습니다. (이미 많은 질문과 답변이 있지만 내 상황에 맞는 것을 찾을 수 없습니다.)
다음은 내 코드의 단축 버전입니다.
override func viewDidLoad() {
super.viewDidLoad()
loadData()
}
func loadData(){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) ) {
dispatch_async(dispatch_get_main_queue()){
self.actInd.startAnimating()
}
var pageSource=self.dpm.readData("https://url.com")
dispatch_async(dispatch_get_main_queue()){
self.refreshUI()
self.actInd.stopAnimating()
}
}
}
func refreshUI(){
//refresh UI
}
func readData(url:String)->NSData?{//This method is in a separate class. dpm
var myUrl=NSURL(string: url)
var request:NSMutableURLRequest=NSMutableURLRequest(URL: myUrl!)
request.timeoutInterval=30
let myHTMLData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
return myHTMLData
}
내가 의도 한 내용을 요약하면 :있는 viewDidLoad에
- 이,() loadData를 호출 loadData() 내가 주보다 다른 스레드를 사용해야합니다 생각하기 때문에, 나는 dispatch_async 사용에
- 데이터를로드 할 때 스레드
- 비동기 스레드에서 readData()를 호출하므로 NSURLConnection을 호출합니다. 로딩이 완료된 후
- 내 UI를 새로 고치려면 (내가 이미 dispatch_async에 호출되기 때문에 syncronousRequest 확인을 믿고 있기 때문에 내가 sendSynchronousRequest 전화), 나는 전화 refreshUI()
그것은 작동하지만, 때로는 충돌 ... 내 생각이 틀린거야 ??
도움을 주시면 감사하겠습니다.
감사합니다.
내가 dispatch_async을 버리고 NSURL 비동기 전적으로 작동해야합니다 제안하고 있는가? 또는 dispatch_async 및 NSURL 비동기를 사용해야합니까? – kwmaeng
'NSURLSession' 비동기 API를 사용한다면 더 이상'dispatch_async'를 사용할 필요가 없습니다. – ipmcc