2015-01-31 2 views
0

나는 이미 In Swift, how to stop all the process until datas retrieved from parse.com in UICOLLECTIONVIEW에 질문했습니다. 다음 함수가 실행되기 전에 parse.com에서 데이터를 검색 할 수 없습니다. 비동기 스레드에 액세스하는 방법을 모르겠습니다. 메인 큐를 "first_fun()"으로 선언 했으므로 먼저 실행해야합니다. 마찬가지로, 그것은 먼저 실행하지만 마침내 끝납니다. 그 전에 다음 함수 ("second_fun()")가 실행됩니다. 이 기능 블록을 큐에 저장하는 방법? 먼저 비동기 스레드를 종료 하시겠습니까? 친절하게 내 코드를 확인하십시오.Swift에서 GCD가 구문 분석을 사용하지 않는 이유는 무엇입니까?

내 코드는 다음과 같습니다 :

override func viewDidLoad() { 

println("START") 
let queue : dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
dispatch_async(queue, { 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    self.first_fun() 
    }) 
}) 

second_fun() 
println("END") 

} 

// FIRST_FUN

func first_fun() { 
println("FIRST CLASS TOP") 
self.par_query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in 

if (error != nil) { 
    NSLog("error " + error.localizedDescription) 
} 
else { 

println("WELCOME to PARSE")   

}//ELSE ENDING 

})//PARSE ENDING 
println("FIRST CLASS BOTTOM") 

} 

// SECOND_FUN

func second_fun() { 

println("WELCOME to SECOND") 

} 

답변

0

는 first_fun에 콜백을 추가하고과 같이 그 콜백 내부 second_fun 전화입니다 해당 콜백을 매개 변수화하여 데이터에 액세스하거나 구문 분석 할 때 오류 발생

Further info for completion blocks in swift

+0

안녕하세요 !! 나는 네 길을 사용했다. 그렇다면 UICollectionView, http://stackoverflow.com/questions/28299481/getting-fatal-error-while-creating-an-instance-for-colectionviewcell에 관해서는 의심 스럽습니다. 친절하게 안내 해줍니다. –

1
이 질문의 본질은

은 "어떻게 비동기 디자인을 설정 않습니다 동기식으로 변환하는 것 "이라고 설명했다. 사람들은 전통적인 절차 스타일 프로그래밍에 익숙해지고 기능/이벤트 기반 시스템에서 문제를 해결하려고 할 때이 벽을 뚫습니다.

귀하의 질문에 대한 답변은 "하지 마십시오." second_fun()에서 일어나는 모든 것이 first_fun()의 결과에 의존하지 않는 시스템 디자인의 새로운 스타일을 배워야합니다. 첫 번째와 두 번째가 정말로 의존적이면 first_fun()에서 마지막 작업으로 second_fun()을 호출해야합니다.

예를 들어, 인터넷에서 끌어온 데이터 (장기 실행 작업 일 수 있음)에 따라보기가있는 경우 일반적으로보기가 회전 대기 표시기를 표시하도록 설정 한 다음 findObjectsInBackgroundWithBlock()을 호출하십시오. 콜백에서 발견 된 결과를 처리하고 다른 UI 요소를 초기화 한 다음 대기 표시기를 원하는보기 내용으로 바꿉니다.

당신은 절차 적 사고를 중단하고 기능적 사고를 시작해야합니다.

func first_fun(callback:() ->()) { 
    //do something async e.g your call to parse 

    self.par_query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in 
     if (error != nil) { 
      NSLog("error " + error.localizedDescription) 
     } 
     else { 
      println("WELCOME to PARSE")   

     }//ELSE ENDING 
     callback() 
    })//PARSE ENDING 
} 

귀하의 viewDidLoad는 다음과 같이 보일 것이다 : 당신은 물론의해야

override func viewDidLoad() { 
    let queue : dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(queue, { 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.first_fun() { 
       self.second_fun() 
      } 
     }) 
    }) 
} 

을 당신이 할 수있는 무엇