1

오늘의 위젯에서 "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에

  1. 이,() loadData를 호출
  2. loadData() 내가 주보다 다른 스레드를 사용해야합니다 생각하기 때문에, 나는 dispatch_async 사용에
  3. 데이터를로드 할 때 스레드
  4. 비동기 스레드에서 readData()를 호출하므로 NSURLConnection을 호출합니다. 로딩이 완료된 후
  5. 내 UI를 새로 고치려면 (내가 이미 dispatch_async에 호출되기 때문에 syncronousRequest 확인을 믿고 있기 때문에 내가 sendSynchronousRequest 전화), 나는 전화 refreshUI()

그것은 작동하지만, 때로는 충돌 ... 내 생각이 틀린거야 ??

도움을 주시면 감사하겠습니다.

감사합니다.

답변

0

작업을 백그라운드 스레드에 마샬링한다고해서 동 기적으로 요청을하는 것이 좋습니다. NSURLSession의 비동기 API를 사용하고 앱이 백그라운드로 이동하는 경우 요청을 취소해야합니다 (또는 종료해야 함). 비동기 API를 사용하면 더 많은 작업이 가능하지만 더 정확한 방법입니다. dispatch_async이 반드시 충분한 "어댑터"는 아닙니다.

+0

내가 dispatch_async을 버리고 NSURL 비동기 전적으로 작동해야합니다 제안하고 있는가? 또는 dispatch_async 및 NSURL 비동기를 사용해야합니까? – kwmaeng

+0

'NSURLSession' 비동기 API를 사용한다면 더 이상'dispatch_async'를 사용할 필요가 없습니다. – ipmcc