2015-07-06 2 views
0

У меня есть метод findObjectsInBackgroundWithBlock в моем viewController. Теперь я хочу выполнить код, но только до тех пор, пока этот фоновый метод не будет закончен. Как я могу это сделать?Выполнить код после фонового процесса - parse.com

Я использую быстрое программирование lanuage.

ответ

0

Это довольно хорошо освещено в документации и руководстве на parse.com. Но может быть, у вас есть более конкретный вопрос/сценарий?

Guide to queries on parse.com

var query = PFQuery(className:"GameScore") 
query.whereKey("playerName", equalTo:"Sean Plott") 
query.findObjectsInBackgroundWithBlock { 
    (objects: [AnyObject]?, error: NSError?) -> Void in 

    if error == nil { 
    // The find succeeded. 
    println("Successfully retrieved \(objects!.count) scores.") 
    // Do something with the found objects 
    if let objects = objects as? [PFObject] { 
     for object in objects { 
     println(object.objectId) 
     } 
    } 
    } else { 
    // Log details of the failure 
    println("Error: \(error!) \(error!.userInfo!)") 
    } 
} 

Edit: специфическая версия для PFUser на массив имен пользователей

var usernames: [String]? 
func loadUsernames() { 

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

      if error == nil { // No error - should be good to go 

       self.userNames = (objects as! [PFUser]).map({$0.username!}) 

       // Call/run any code you like here - remember 'self' keyword 
       // It will not run until userNames is populated 
       self.callSomeMethod() 

      } else { // Error - do something clever 

      } 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    loadUsernames() 
} 
+0

Я хочу выполнить другой метод до тех пор, пока процесс backgound не завершится ... Запрос добавляет strimgs к массиву. Затем я хочу выполнить другой метод, но только до тех пор, пока не будут добавлены все строки! Ты знаешь, что я имею в виду? –

+0

Я отредактировал свой ответ, чтобы включить конкретный пример. Обратите внимание, что он будет работать только так, как если бы вы использовали собственные объекты PFUser. Я все еще не уверен, хотите ли вы, чтобы какой-либо другой цикл работал во время выполнения запроса, а затем остановился, когда пользовательские имена готовы? Однако комментарий, добавленный ниже, предполагает, что вы вызываете некоторый код в цикле for, который не должен быть ... Но дайте мне знать, если вы все еще не уверены в том, как действовать. –

0

Вот несколько примеров кода, который может помочь вам. Неясно, как бы вы ограничили код (PRE-BACKGROUND CODE) для запуска только при завершении фоновой обработки. Возможно, вы захотите вставить какой-либо код в функцию ответа уведомления либо для подтверждения того, что этот ПРЕДВАРИТЕЛЬНЫЙ КОДЕКС завершен, либо для его завершения.

// ParseTestViewController.swift 

import UIKit 
import Foundation 
import Parse 

class ParseTestViewController: UIViewController { 
var userData = [String]() 

func codeToExecuteBeforeStringsAreAppended() { 
} 
func codeToExecuteAfterStringsAreAppended() { 
    // can use the array 'userData' 
} 

override func viewDidLoad() { 
    NSNotificationCenter.defaultCenter().addObserver(self, 
     selector: "notificationResponse:", 
     name: "recordsLoaded", 
     object: nil 
    ) 

    self.getUserdataForUsername("MyName") 
    /* ========================== 
    Insert code tto be executed immediately after making the call that must not use the data returned by Parse. The function returns right away and the background may not have completed. 
    */ 
    codeToExecuteBeforeStringsAreAppended() 
} 
func getUserdataForUsername (queryUserName: String) { 
    var query = PFQuery(className:"UserData") 
    query.whereKey("username", equalTo: queryUserName) 
    let notification = NSNotification(name: "userDataRetrieved", object: self) 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]?, error: NSError?) -> Void in 

     if error == nil { 
      for object in objects! { 
       if let username = object["username"] as? String { 
        self.userData.append (username) 
       } 
      } 
     } else { 
      // Log details of the failure 
      println("Error: \(error!) \(error!.userInfo!)") 
     } 
     NSNotificationCenter.defaultCenter().postNotification(notification) 

    } 
} 

func notificationResponse (notification: NSNotification) { 


    // this is executed after the background processing is done 
    // Insert the code that uses the data retrieved from Parse 
     codeToExecuteAfterStringsAreAppended() 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
} 
} 
+0

Посмотрите мои комментарии при первом ответе :) –

+0

Непонятно, что вы пытаетесь сделать. Но я изменил код, чтобы добавить добавление массива. –

+0

Я использую PFQuery, который загружает все мои имена пользователей в массив с именем usernames! Затем я хочу выполнить метод, но только тогда, когда к этому массиву уже добавлены ВСЕ имена пользователей! Проблема в том, что когда я пишу код этого метода в цикле for, он выполняется каждый раз, когда он добавляет одно имя пользователя. Но я хочу только выполнить его после последнего имени пользователя, которое он добавляет. Так где мне поставить код? @Syed Tariq –

Смежные вопросы