2016-06-29 4 views
0

나는 세마포어가 처음 인 것을 처음으로 인정할 것이다. 그러나, 나는이 코드 블록을 몇 시간 동안 보았고 추가적인 눈 세트가 필요할 것입니다. 어떤 이유로 "dispatch_semaphore_signal"이 절대 부딪히지 않아 내 앱이 무기한 중단됩니다. 다른 뷰 컨트롤러에서 세마포를 성공적으로 사용했지만 어떤 이유로이 세마포어가 작동하지 않습니다. 어떤 아이디어?SWIFT : 내 세마포어가 작동하지 않는 이유는 무엇입니까?

let semaphore = dispatch_semaphore_create(0) 


    _ = deviceSession.dataTaskWithRequest(deviceRequest, completionHandler: { (data, response, error) in 
     let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     if (dataString?.rangeOfString("HTTP Status 403").location != NSNotFound){ 
      print("Access Was Denied") 
     } else{ 
      let deviceListParser = NSXMLParser(data: data!) 
      let deviceListParserDelegate = DeviceListParser() 
      deviceListParser.delegate = deviceListParserDelegate 
      deviceListParser.parse() 
     } 
     dispatch_semaphore_signal(semaphore) 
    }).resume() 

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
    self.tableView.reloadData() 
+0

세마포어를 잊어 버리고 테이블 뷰를 완료 핸들러에 다시로드하라. 비동기 작업을 해결하기위한 세마포는 프로그래밍 습관이 매우 나쁜 편입니다. – vadian

+0

안녕하세요, 저는 이것을 게시하기 전에 성공하지 못했습니다. 내 테이블에 값이 없습니다. 그런 다음 화면에서 값을 스크롤하면 다시 초점을 맞출 때 값이 채워집니다. – GED125

+0

그러면 세마포어가 문제를 해결하지 못합니다. 나는 NSXMLParser에 익숙하지 않지만이 클래스가 * didFinish *를 나타내는 delegate 메서드에서 테이블 뷰를 비동기 적으로 다시로드하는 경우에도 사용됩니다. – vadian

답변

0

나는 NSNotification을 사용하는 Vadian의 제안에 따라이 문제를 해결했습니다.

NSNotificationCenter.defaultCenter().postNotificationName("load", object: nil) 

그리고 테이블 뷰 컨트롤러

내가이 "viewDidLoad에"다음에 추가 : 파서에서 "parserDidEndDocument"기능 I 추가 마법처럼

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(loadTable), name:"load", object: nil) 

작품, 이것은 내가하는 기능입니다 나는 미래에 많은 것을 쓸 것이라고 확신한다. 감사합니다 바디 언!

관련 문제