2016-11-03 9 views
1

Я не размещаю весь код, потому что он действительно слишком большой. Во всяком случае, это регистрация пользователя, построенная таким образом.Capture self никогда не использовался

Существует модальный, чей ребенок является pageViewController:

  • первая страница для входа в систему;
  • вторая страница для регистрации;

От пользователя Вы можете связаться с Регистрацией и, после регистрации, на страницеViewController должен автоматически перейти на первую страницу, чтобы пользователь мог войти в систему со своими новыми учетными данными.

Процесс регистрации пользователя управляется кнопкой и Alamofire: после нажатия кнопки значения, введенные пользователем в текстовые поля, проверяются, затем я начинаю почтовый запрос, отправляя данные на сервер и получая данные JSON назад через некоторое время.

Это что-то очень простое (жаль говорить слишком много), но в конце концов, после того, как я получаю JSON, что-то странное происходит здесь:

let j = JSON as! NSDictionary 
let userStatus = j.object(forKey: "status")! 

    if((userStatus as! Int) == 0){ 

     // 
     print("user registerd") 

     let alert = UIAlertController(title: "Registration ok", message: "Registration OK", preferredStyle:UIAlertControllerStyle.alert) 

     let okAlert = UIAlertAction(title:"OK", style: .default, handler: {action in v.scrollToPreviousViewController() }) 

     alert.addAction(okAlert) 

     self.present(alert, animated: true, completion: nil) 

Что должен делать этот код? Как только пользователь нажмет кнопку предупреждения, диспетчер просмотра страницы должен вернуться с анимацией на экран входа в систему.

Что происходит? Он возвращается обратно, но без анимации.

Это привело меня к мысли, что я должен избегать «загрязнения» глобальной нити, зарезервированной для графического интерфейса. И, фактически, я попытался поместить весь код внутри a:

DispatchQueue.main.async { [unowned self] in 

без каких-либо успехов.

Затем я попробовал другую вещь:

let okAlert = UIAlertAction(title:"OK", style: .default, handler: 
              {action in DispatchQueue.main.async { [unowned self] in v.scrollToPreviousViewController() }}) 

Я не вполне понимаю, почему, но это практически работает и устраняет проблему с анимацией.

Но в этом unowned self появляется предупреждение: «Захват самости никогда не использовался». Что я делаю не так?

ответ

2

Если вы не использовали self внутри блока асинхронизации, вы получите это предупреждение. Попробуйте с _ вместо self.

+0

Это работает. И он также работает, оставляя только v.scrollToPreviousViewController(). Но, это правильный способ сделать то, что я делаю? :-) –

+0

Да, это прекрасно. Пожалуйста, примите ответ, если вы согласны. – Satheshkumar

+0

Я принимаю ответ завтра, если между тем кто-то не публикует что-то интересное :-) –

1

, чтобы увидеть, что скор список захвата для, проверить этот пример ...

var i = 25 

var cl = {print(i)} 
var clc = {[i] in print(i)} 

i = 35 

cl() // 35 
clc() // 25 

предупреждающее сообщение «Захват само никогда не использовалась», поэтому понятно. вам не нужно вводить себя в свой список захвата, потому что вы его не используете

+0

На игровой площадке это возвращает ошибку –

+0

@IanBell, какая ошибка, где?он работает на моей игровой площадке, как и ожидалось. – user3441734

+0

Извините, я ошибся, это была ошибка XCode, а не ваш код :-) –