Как принудительно асинхронно сохранить постоянный подкласс?

Редактировать 1: я реструктурировал свои ViewController'ы, чтобы упростить выполнение того, что я хочу.

Редактировать 2: я понял, что при добавлении примечаний к моему коду чего-то не хватает, другая функция переопределяет первый переход.

В этом ViewController создается аннотация; все, что мне нужно от этого представления, это передать touchMapCoordinates другому ViewController, чтобы я мог сохранить PFGeoPoint в массиве.

Редактировать 3 После долгой работы над пониманием того, что происходит, и упрощением кода я пришел к окончательному выводу, основанному на Переменная Swift не инициализирована перед использованием (но не используется) , что текущий метод, который я пытаюсь использовать не будет работать в любом случае или сценарии из-за асинхронного сохранения. Если кто-то знает обходной путь, то вы официально сделали что-то, чего раньше не делали :).

Ошибка, которая появляется

Константа 'boi', используемая до инициализации

Подкласс, объявленный в Appdata для использования в любом месте проекта

import Foundation
import Parse
import MapKit

class MyAnnotation: PFObject, PFSubclassing, MKAnnotation {

// MARK: - Properties

@NSManaged var location: PFGeoPoint

// MARK: - Initializers

init(coordinate: CLLocationCoordinate2D) {
    super.init()
    self.location = PFGeoPoint(latitude: coordinate.latitude, longitude: coordinate.longitude)
    print(location)
    
}

override class func initialize() {
    struct Static {
        static var onceToken : dispatch_once_t = 0;
    }
    dispatch_once(&Static.onceToken) {
        self.registerSubclass()
        
        
    }
}

// MARK: - PFSubclassing protocol

static func parseClassName() -> String {
    return "AnnotationPins"
}

// MARK: - MKAnnotation protocol

var coordinate: CLLocationCoordinate2D {
    return CLLocationCoordinate2DMake(location.latitude, location.longitude)
}

var title: Строка? = Начать тему

}

Где весь код будет сохранен асинхронно вместе

   } else {
        
        let imageData = UIImagePNGRepresentation(self.galleryCameraImage.image!)
        let parseImageFile = PFFile(name: "upload_image.png", data: imageData!)
        let boi : MyAnnotation
        
        let textTitleandText = PFObject(className: "AnnotationPins")
        textTitleandText["textTopic"] = userTopic.text
        textTitleandText["textInformation"] = userText.text
        textTitleandText["userUploader"] = PFUser.currentUser()
        textTitleandText["imageFile"] = parseImageFile!
        textTitleandText["location"] = boi.location
        
        textTitleandText.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
            if error == nil {

Если бы кто-нибудь мог помочь, это было бы очень признательно!


person Jamal Rasool    schedule 04.02.2016    source источник


Ответы (2)


Перейдите к методу ride prepareForSegue, как показано ниже.

override func prepareForSegue(segue: UIStoryboardSegue, sender: 

AnyObject?) {
       if segue.identifier == "SegueID" {
           let destinationVC = segue.destinationViewController as! DestinationViewController  
// Create property in destinationView controller & assign required data from here.
       }
    }

Надеюсь, поможет.

person Nilesh Patel    schedule 04.02.2016
comment
Я обновил свой код, чтобы точно смоделировать текущую ситуацию. - person Jamal Rasool; 09.02.2016

Давайте рассматривать ваши Location data как обычные данные, которые будут передаваться через переходы. Вы можете использовать этот метод для настройки переменной целевого контроллера представления (того же типа), которая будет содержать данные о вашем местоположении.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   //check your segue name
   if segue.identifier == "YourSegueIdentifier" {
       let destinationVC = segue.destinationViewController as! YourDestinationViewController
       destinationVC.locationVariableInDestinationVC = locationVariableInCurrentVC 
   }

}

Выше приведен самый простой способ передачи данных через переход, вы можете использовать тот же подход и для данных о вашем местоположении.

Надеюсь, это поможет!!

Update: Based on your updated code

Уберите func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {} из своей handleLongPress функции. Функция PrepareForSegue вызывается автоматически, когда происходит какая-либо навигация по переходам.

Если вы хотите инициировать переходную навигацию программно, назначьте переходу идентификатор и просто вызовите self.performSegueWithIdentifier("YourSegueIdentifier", sender: nil)

person Ajeet Pratap Maurya    schedule 04.02.2016
comment
} override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "China" { let destinationVC = segue.destinationViewController as! AnnotationViewController destinationVC.location = MyAnnotation } } Итак, в коде я продолжаю получать сообщение об ошибке, тип «ViewController» не имеет местоположения члена - person Jamal Rasool; 04.02.2016
comment
вам нужно добавить переменную местоположения в ваш контроллер представления назначения, в котором будут храниться ваши данные. Это похоже на то, как вы присваиваете значение переменной, которая доступна в контроллере представления назначения. Надеюсь, это имеет смысл :) - person Ajeet Pratap Maurya; 05.02.2016
comment
` var locationdata = PFGeoPoint () `, поэтому у меня есть это в целевом контроллере просмотра, но он все еще не работает, когда я его установил = locationdata в контроллере просмотра карты - person Jamal Rasool; 05.02.2016
comment
ваша переменная myAnnotation имеет тип PFGeoPoint? и, как вы объявили locationdata, следовательно, будет destinationVC.locationdata = MyAnnotation - person Ajeet Pratap Maurya; 05.02.2016
comment
Я обновил код новой проблемой, которую я пытался решить в целом, при этом myAnnotation является переменной PFGeoPoint. - person Jamal Rasool; 06.02.2016
comment
Я обновил свой код, чтобы точно смоделировать текущую ситуацию. - person Jamal Rasool; 09.02.2016
comment
Уберите func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {} из своей handleLongPress функции. Функция PrepareForSegue вызывается автоматически, когда происходит какая-либо навигация через переходы. - person Ajeet Pratap Maurya; 09.02.2016
comment
Когда я помещаю функцию подготовки к переходу за пределы длинного нажатия дескриптора функции, я теряю доступ к аннотации. - person Jamal Rasool; 09.02.2016
comment
В этом случае просто переместите свою переменную var touchMapCoordinate за пределы handleLongPress, чтобы вы могли получить доступ в любом месте вашего класса. Ваше объявление будет примерно таким: var touchMapCoordinate: CLLocationCoordinate2D?, так как ваш annotation.coordinate имеет тип CLLocationCoordinate2D. обратитесь к этому документу developer.apple.com/library/prerelease/mac/documentation/MapKit/ - person Ajeet Pratap Maurya; 09.02.2016
comment
Ну, это не совсем то, как работает код, я предлагаю пользователю выбрать место, где будет находиться аннотация, используя жест длительного нажатия. Отсюда почему, как только я достаю вар тачмап, все зависит от всего остального. Так что я; в некотором смысле вынуждены работать в рамках этих параметров. :( - person Jamal Rasool; 09.02.2016
comment
Я не понимаю... единственное, что я говорю, это DECLARE ваша touchMapCoordinate вне этой функции и INITIALISE внутри вашей handleLongPress функции. таким образом, вы по-прежнему сможете использовать touchMapCoordinate внутри функции handleLongPress и в prepareForSegue. :) - person Ajeet Pratap Maurya; 09.02.2016
comment
Вероятно, это глупый вопрос, но не могли бы вы привести пример того, как я могу это сделать в этом коде? - person Jamal Rasool; 10.02.2016