2015-01-04 5 views
1

에서 결과 가져 오기 처음 : 저는 CloudKit과 "dispatch"-mchanisms에서 정말 새로운 것 같습니다.cloudkit-query

하지만 배열로 쿼리 결과를 반환하는 swift 함수를 작성하고 싶습니다. 이제 내 문제는 함수가 쿼리가 끝날 때까지 기다리지 않고 빈 배열을 받는다는 것입니다. 내 DB에는 레코드가 있지만 제대로 다시 가져 오지 않습니다.

그래서 전체 dispatch_async 메커니즘 등을 이해하지 못했습니다. 또한 CloudKit에 대한 raywenderlich.com의 튜토리얼을 읽었지 만 여전히 배열을 올바르게 반환 할 수는 없습니다.

이것은 실제 코드입니다. 나는 종종 사람들이 dispatch_async-methods를 사용하는 것을 보았지만 실제로 어떻게 배열을 반환 할 수 있는지 이해하지 못합니다.

func loadMyShopsCoolAwesome() ->[Shops]{ 
     let container = CKContainer.defaultContainer() 
     var publicDB = container.publicCloudDatabase 

     let myQuery = CKQuery(recordType: "Shops", predicate: NSPredicate(value: true)) 
     var myShops = [MyShops]() 

     publicDB.performQuery(myQuery, inZoneWithID: nil) { 
      results, error in 
      if error != nil { 
       println(error) 

      } else { 
       for record in results{ 
        let shop = MyShops(nameElementAt: record.objectForKey("nameElementAt") as Int, nameElementFromSplit: record.objectForKey("nameElementFromSplit") as Int, nameSplitString: record.objectForKey("nameSplitString"), priceElementAt: record.objectForKey("priceElementAt") as Int, priceSplitString: record.objectForKey("priceSplitString"), shopName: record.objectForKey("shopName"), shopURL: record.objectForKey("shopURL"), xPathName: record.objectForKey("xPathName"), xPathPrice: record.objectForKey("xPathPrice")) 

       myShops.append(shop) 
       } 
       return myShops 
      } 
     } 



    } 

답변

0

함수에서 데이터를 반환하지 않아야합니다. 이 방법은 대기 메커니즘을 구현하는 경우에만 작동합니다 (일반적으로 세마포어로 수행). 그렇게하면 데이터를 가져 오는 동안 앱을 차단하게됩니다.

대신 무효를 반환해야하며 상점을 반품하는 대신 상점에서 새 기능을 호출해야합니다. 거기에서 상점 처리를 계속해야합니다. 그래서 함수는 다음과 같습니다

func loadMyShopsCoolAwesome() { 
... 

그리고 대신

return myShops 

당신은 새로운 함수를 호출해야의

를.

func processShops(shops: [Shops]) { 
    // do work with shops 
    ... 
} 

는 또한이 배경 큐에서 호출되므로주의 : 다음과 같은 새로운 함수를 호출 할

processShops(myShops) 

: 같은. 그래서 당신이 인터페이스를 가지고 뭔가를하고 싶다면 다음과 같이 메인 큐에서 호출해야합니다 :

NSOperationQueue.mainQueue().addOperationWithBlock { 
     ... 
} 
+0

어떻게 메인 대기열에서 호출 할 수 있습니까? – Christian

+0

나는 대답을 –

+0

에 추가했습니다 : dispatch_async (dispatch_get_main_queue()? 또한 그 mainQueue- 블록 안에 processShops를 넣어야합니까? – Christian