2016-02-12 8 views
5

मैं pullDiews() को पूरा करने के बाद loadViews() को चलाने की कोशिश कर रहा हूं और मैं सोच रहा हूं कि ऐसा करने का सबसे अच्छा तरीका क्या है? मैं इसके साथ 10 सेकंड टाइमआउट भी सेट करना चाहता हूं ताकि यदि संभव हो तो मैं नेटवर्क त्रुटि प्रदर्शित कर सकता हूं। मैंने जो पढ़ा है, उससे जीसीडी ऐसा लगता है कि इसे पूरा करने का तरीका है लेकिन मैं इसके कार्यान्वयन पर उलझन में हूं। आपके द्वारा दी जा सकने वाली कोई भी सहायता के लिए शुक्रिया!किसी अन्य फ़ंक्शन को चलाने के बाद

//1 
pullData() 
//2 
loadViews() 
+7

आपको चाहिए loadViews को कॉलबैक/समापन ब्लॉक के रूप में खींचने के लिए लोड करें ताकि जब भी पुलडाटा इसे पूरा कर लेता है तो इसे खींच सकता है मैं इसे – luk2302

+0

मैं ऐसा करने के बारे में कैसे जा सकता हूं? अगर मैं उस मार्ग पर जाऊं तो क्या मैं अभी भी एक टाइमर लागू कर सकता हूं? – Opei

+2

उदाहरण के लिए "त्वरित समापन ब्लॉक" की खोज करके - आपका प्रश्न आम तौर पर बहुत व्यापक है और मुख्य रूप से राय-आधारित उत्तरों को मेरी टिप्पणी की तरह आकर्षित करेगा। आपको अधिक संदर्भ दिखाना होगा, * बिल्कुल * जो आप प्राप्त करना चाहते हैं उसे समझाएं: टाइमर या इसे पूरा करने के बाद दौड़ एक दूसरे के विपरीत काफी सुंदर है। इसके अलावा आपको यह दिखाना चाहिए कि आपने अभी तक क्या प्रयास किया है। – luk2302

उत्तर

9

आपको क्या करना होगा एक पूरा होने के ब्लॉक के साथ एक पूरा होने हैंडलर है मैं निम्नलिखित का इस्तेमाल किया।

func firstTask(completion: (success: Bool) -> Void) { 
    // Do something 

    // Call completion, when finished, success or faliure 
    completion(success: true) 
} 

और इस तरह अपनी पूर्णता को ब्लॉक का उपयोग करें::

firstTask { (success) -> Void in 
    if success { 
     // do second task if success 
     secondTask() 
    } 
} 
+0

यह बहुत अच्छा लग रहा है। साझा करने के लिए धन्यवाद। क्या यह एक टाइमआउट मुद्दे को संभालेगा? क्या समापन ब्लॉक पर टाइमआउट में कुछ प्रकार का निर्माण किया गया है? – Opei

+1

यदि कोई टाइमआउट है, जैसे कि आप वेब से डेटा प्राप्त कर रहे हैं, तो आप विफलता 'सफलता (सफलता: झूठी)' के साथ पूरा होने पर कॉल करें। समापन ब्लॉक स्वचालित रूप से आग नहीं होगा, अगर नहीं कहा जाता है। लेकिन आप अभी भी अपने पहले टास्क में एक टाइमर जोड़ सकते हैं, यह जांचने के लिए कि xx सेकेंड के बाद अभी भी कोई परिणाम नहीं है या नहीं। –

+0

ठीक है धन्यवाद! – Opei

2

मैं एक ऐसी ही स्थिति है जहाँ मैं एक दृश्य init करने के लिए एक बार डेटा पार्स सर्वर से खींचा जाता है था।

func fetchQuestionBank(complete:()->()){ 

     let userDefault = NSUserDefaults.standardUserDefaults() 
     let username = userDefault.valueForKey("user_email") as? String 

     var query = PFQuery(className:"QuestionBank") 
     query.whereKey("teacher", equalTo: username!) 

     query.findObjectsInBackgroundWithBlock { (objects:[AnyObject]?, error:NSError?) -> Void in 

      if error == nil { 
       if let objects = objects as? [PFObject] { 

        var questionTitle:String? 
        var options:NSArray? 

        for (index, object) in enumerate(objects) { 

         questionTitle = object["question_title"] as? String 
         options = object["options"] as? NSArray 
         var aQuestion = MultipleChoiceQuestion(questionTitle: questionTitle!, options: options!) 
         aQuestion.questionId = object.objectId! 
         InstantlyModel.sharedInstance.questionBank.append(aQuestion) 
        } 


        complete() 
       } 
      }else{ 
       println(" Question Bank Error \(error) ") 
      } 
     } 
    } 

और यह आप विधि कॉल है:

self.fetchQuestionBank({() ->() in 
         //Once all the data pulled from server. Show Teacher View. 
         self.teacherViewController = TeacherViewController(nibName: "TeacherViewController", bundle: nil) 
         self.view.addSubview(self.teacherViewController!.view) 
        }) 
2

आप इस तरह प्राप्त कर सकते हैं:

इसका वास्तव में एक बनाने के लिए सरल - शायद बस

func demo(completion: (success: Bool) -> Void) { 
    // code goes here 
    completion(success: true) 
} 
संबंधित मुद्दे