2015-01-22 1 views
4

그래서 여기에는 작동하지 않는 코드 블록이 있습니다. 이는 선택적 값의 랩핑을 시도하는 동안 nil을 발견했기 때.입니다. 그것은 비동기 메서드 내에서 초기화되기 때문에입니다. 내 질문은, 어떻게 결과를 가져올 때까지 함수를 반환 보류합니까? 당신이 블록의 결과를 기다려야합니다Swift : 내부에서 결과 반환하기 dispatch_async

struct Domain { 
    var name: String? 
    var tld: String? 
    var combined: String { 
     get { 
      return self.name!+self.tld! 
     } 
    } 
    var whoIs: String { 
     get { 
      if self.whoIs.isEmpty { 
       var result: String? 
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
        let whois_url = NSURL(string: SEARCH_URL+self.combined+"/whois") 
        result = NSString(contentsOfURL: whois_url!, encoding: NSUTF8StringEncoding, error: nil) 
        print(result!) 
       }) 
       return result! 
      } 
      return self.whoIs 
     } 
    } 
} 

답변

1

, 단순히 dispatch_syncdispatch_async 교체 :

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
    let whois_url = NSURL(string: SEARCH_URL+self.combined+"/whois") 
    result = NSString(contentsOfURL: whois_url!, encoding: NSUTF8StringEncoding, error: nil) 
    print(result!) 
}) 

이 메소드는 URL의 내용까지 반환하지 않도록 할 것은으로 페치 결과.

+2

와우, 정말 쉬웠습니까? 감사! – garetmckinley

+0

당신은 dispatch_sync를 당신이 closure -> deadlock을 보내고있는 곳과 같은 쓰레드로하지 말아야한다. – smat88dd