Ждать выбор пользователя


#1

привет!
шлю пользователю алерт и потом делаю гет запрос исходя с ответом пользователя

   var a = 0 // default
let userAction = UIAlertController(title: "Select", message: "Select an action", preferredStyle: UIAlertControllerStyle.alert)

userAction.addAction(UIAlertAction(title: "action 1", style: .default, handler: { (action: UIAlertAction!) in
    a = 1
}))

userAction.addAction(UIAlertAction(title: "action 2", style: .cancel, handler: { (action: UIAlertAction!) in
    a = 2
}))

present(userAction, animated: true, completion: nil)

let resp = Just.get("http://localhost/\(a)").text
return resp

но запрос посылается до того как пользователь выберет опцию
как сделать так что бы код после алерта не бежал пока алерт не будет закрыт?


#2

А Вы уберите оттуда Just.get… и добавьте его в handler блок Ваших экшенов.


#3

пробовал,но тогда return отробатывает до just.get
а если return туда же поднимаю ,тогда ошибку кидает “unexpected non-void return value in void function”


#4

А если просто убрать return. Судя по ошибке, Вы пытаетесь что-то вернуть в функции, которая ничего не возвращает.


#5

return мне нужен :frowning:
да и если его совсем убрать тогда ругается мол return’a нет


#6

Покажите пожалуйста весь метод целиком


#7
function myFunc() -> {
	var a = 0 // default
	let userAction = UIAlertController(title: "Select", message: "Select an action", preferredStyle: UIAlertControllerStyle.alert)

	userAction.addAction(UIAlertAction(title: "action 1", style: .default, handler: { (action: UIAlertAction!) in
	    a = 1
	}))

	userAction.addAction(UIAlertAction(title: "action 2", style: .cancel, handler: { (action: UIAlertAction!) in
	    a = 2
	}))

	present(userAction, animated: true, completion: nil)

	let resp = Just.get("http://localhost/\(a)").text
	return resp
}

Вызываю так toast(myFunc)

toast - функция которая выводит toast сообщение(собственно по этому return и важен)


#10

По сути ругается потому что запрос не успевает отработать до return. Используйте многопоточность, чтобы асинхронно выполнить код, а по завершению кода уже возвращать что-либо.
С телефона больше не подскажу.


#11

не,дело не в скорости 100%
запрос отсылается при нажатии на один из вариантов алерта,а return отробатывает до того как нажимаю


#12

вот поэтому и нужно возвращать после того, как ответи пришел. а до этого возвращать не нужно.


#13

А какой тип у resp при a = 1?

let resp = Just.get("http://localhost/\(1)").text
print(type(of: rest)

#15

так он отробатывает до того как запрос пошлётся,дело не в этом,даже если вместо запроса print(“test”)
сначала отработает return(до того как я нажму кнопку на алерте) и только потом print


#16

string
//сообщение должно содержать больше 20 символо в


#17

А можете уточнить, какая именно ошибка возникает при таком коде?

function myFunc() -> String {
var a = 0 // default
let userAction = UIAlertController(title: "Select", message: "Select an action", preferredStyle: UIAlertControllerStyle.alert)

userAction.addAction(UIAlertAction(title: "action 1", style: .default, handler: { (action: UIAlertAction!) in
    a = 1
    let resp = Just.get("http://localhost/\(a)").text
    return resp
}))

userAction.addAction(UIAlertAction(title: "action 2", style: .cancel, handler: { (action: UIAlertAction!) in
    a = 2
    let resp = Just.get("http://localhost/\(a)").text
 	return resp
}))

present(userAction, animated: true, completion: nil)

#18

unexpected non-void return value in void function

я в свифте не эксперт,по предполагаю что handler { ...} то что между лямбдами считается как инлайн функция и если я пишу return то он делает его из неё,а не из основной функции


#19

А вы дописали сюда String? function myFunc() -> String {}


#20

да,конечно
//20 символов


#21

Ой, и правда. Я неправильно понял весь диалог. Прошу прощения за отнятое время.


#22

Здравствуйте, у вас return должен происходить после print, вам администратор говорил. Попробуйте через поточность.