2015-02-20 3 views
1

Я создаю пользователя и регистрирую пользователя после использования SDK для Facebook. Все так же, как и при правильной установке пользователя в базу данных. Затем я хочу представить предупреждение и после отклонения предупреждения, я хочу загрузить другую раскадровку (по существу, в главное меню).Попытка представить ViewController, который уже представляет (0)

Теперь я понимаю, что проблема связана с потоками. НО .. Я передаю загрузку раскадровки и т. Д. В качестве блока для предупреждения. Поэтому не следует ли его вызывать только после того, как пользователь отклонит предупреждение? Я также попытался заставить его работать по основной теме (что было упомянуто here), но я все еще получаю ошибку.

Что мне здесь не хватает?

The originating call: 

if DBUser.insertDictionary(user.getModelAsStringDictionary()) { 
    if DBUser.loginUserWithFacebookId(facebookId!){ 
     self.accountCreatedAlert() 
    }else{ 
     //log error, user could not be logged in. 
    } 
    }else{ 
     // log error user account could not be inserted into the database 
    } 
} 

Асинхронный комплектации предупредительного текста и метода switchToMainStoryboard():

private func accountCreatedAlert(fn:()){ 
    let asyncMoveToMain = {dispatch_async(dispatch_get_main_queue()) { 
     self.switchToMainStoryboard() 
    }} 
    self.showAlert("You will now be logged in", title: "Account created", fn: asyncMoveToMain) 
} 

настороже:

func showAlert(text : NSString, title : NSString, fn:()->Void){ 
    var alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.Alert) 
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 
    UIApplication.sharedApplication().delegate?.window!?.rootViewController?.presentViewController(alert, animated: true, completion: fn) 
} 

А где раскадровка загружается:

func switchToMainStoryboard() ->Void{ 
    let main = UIStoryboard(name: "Main", bundle: nil) 
    var viewController = main.instantiateInitialViewController() as UIViewController 
    viewController.modalTransitionStyle = UIModalTransitionStyle.CoverVertical 
    self.presentViewController(viewController, animated: true, completion: nil) 
} 

ответ

0

Так что я пробовал много возиться с методами dispatch_async и dispatch_sync, и каждый раз, независимо от того, что я делал, я получал условие блокировки, которое заморозило пользовательский интерфейс.

При дальнейшей проверке документации (и моего кода) я предоставил блок вместо AlertControllerAction вместо текущегоViewController. Благодаря this post для обеспечения синтаксиса. Полученные в результате изменения заключаются в следующем:

// MARK: Alert Related Methods 
func showAlert(text : NSString, title : NSString, fn:()->Void){ 
    var alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.Alert) 
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: {(alert: UIAlertAction!) in fn()})) 
    UIApplication.sharedApplication().delegate?.window!?.rootViewController?.presentViewController(alert, animated: true, completion: nil) 
} 

А потом ходил называть это как так:

private func showAccountCreatedAlertThenLoadMainStoryboard(){ 
    self.showAlert("You will now be logged in", title: "Account created", fn: {self.switchToMainStoryboard()}) 
} 

Необходимая последовательность теперь происходит без проблем. Надеюсь, это помогает кому-то другому.

-2

Альтернативный способ заключается в том, что вы можете попросить НОД задержать с вашей следующей презентации, например, так:

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC))) 
dispatch_after(delayTime, dispatch_get_main_queue()) { 
    // next present 
}