我似乎无法弄清楚这一点:我试图使用Alamofire请求从我的服务器(在JSON中)获取错误,但我无法获得该函数之外的值.
这是我的功能的实现:
func alamoRequest(username : String, email: String, password: String, facebook: String, completionHandler : (String?) -> Void) {
var jsonValue : JSON?
let URL = "http://someurl.com/login.php"
let requestParameters = ["username" : username, "email" : email, "password" : password, "facebook" : facebook, "date": NSNull()];
var jsonString : String = String()
Alamofire.request(.GET, URL, parameters: requestParameters).validate().responseJSON {
response in
switch response.result {
case .Success:
if let value = response.result.value {
jsonValue = JSON(value)
jsonString = jsonValue!["error"].stringValue
print("Value in implementation is: \(jsonString)")
}
case …Run Code Online (Sandbox Code Playgroud) 好吧,标题真的说明了一切,我无法在任何适合我的地方找到答案,所以我转向StackOverFlow.我正在尝试获取用户步数并将该值分配给UILabel.所以这里是我的一些代码(请注意,此函数包含在另一个类中,因此标签不在此函数的范围内):
func readTodayHealthData() -> Int {
var stepCount: Int = 0
func getStepsHealthData() {
let stepsUnit = HKUnit.countUnit()
let sumOption = HKStatisticsOptions.CumulativeSum
let stepsHealthDataQuery = HKStatisticsQuery(quantityType: stepsHealth, quantitySamplePredicate: predicate, options: sumOption) {
query, results, error in
if let sumQuantity = results?.sumQuantity() {
dispatch_async(dispatch_get_main_queue(), {
stepCount = sumQuantity.doubleValueForUnit(stepsUnit) * 2
})
}
}
healthKitStore?.executeQuery(stepsHealthDataQuery)
}
return stepCount
}
//Set UILabel Value
//**This code is in my View Controller which is in a separate class as a result this label …Run Code Online (Sandbox Code Playgroud) 处理某些FirAuth事情,但由于某种原因,我无法弄清楚如何检查用户是否已经提出了电子邮件地址.我曾尝试过.fetchProvidersForEmail一段时间之前在其他问题中提出的建议,但无论出于何种原因,它都无法正常工作.此外,对于完成处理程序,我是非常环保的,所以任何建设性的批评都会受到欢迎.所以,就目前而言,我的代码中与此相关的部分是:
import UIKit
import Firebase
class LoginViewController: UIViewController {
var reply : Bool = true
@IBOutlet weak var emailTxt: UITextField!
@IBAction func nextScreen(sender: UIButton) {
print(emailCheck(emailTxt.text!))
}
func emailCheck(input : String)->Bool{
let pullEmails = FIRAuth.auth()!.fetchProvidersForEmail(input, completion:{
result,error in
var decision : Bool = true
if error == "nil" {
print(error)
self.reply = true
}else{
print(error)
self.reply = false
}
})
return reply
}
}
Run Code Online (Sandbox Code Playgroud)
所以这就是回复总是打印true,可能是因为我明确地将它定义在顶部.无论哪种方式,它几乎就像完成处理程序没有等待实际完成它之前returns的值.我试图弄清楚如何使用它们,AsyncTasks但是我想知道我在这里是否有一个简单的错误可以解决这个问题.谢谢大家!
尝试使用链接中第一个答案中的代码(由 Kampai 提供): How to use UIAlertController to replace UIActionSheet?
但是,在我的代码中甚至没有调用完成处理程序。
按下两个按钮后可以解除警报操作表,但完成处理程序内部没有任何工作。知道可能是什么问题吗?我是使用完成处理程序的新手,并试图在网上找到答案,但很少有人遇到与我相同的问题。
- (IBAction)takePhotoButtonPressed:(UIButton *)sender {
pressedButtonTagNumber = sender.tag;
UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
[actionSheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
// Cancel button tappped
[self dismissViewControllerAnimated:YES completion:^{
}];
}]];
[actionSheet addAction:[UIAlertAction actionWithTitle:@"Take a Photo" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
NSLog(@"!");
// Take a Photo button tapped
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"0"); // NOT CALLED
// Initialize UIImagePickerController
UIImagePickerController *takePhotoImagePickerController = [[UIImagePickerController alloc] init]; takePhotoImagePickerController.delegate = self;
takePhotoImagePickerController.allowsEditing = YES; …Run Code Online (Sandbox Code Playgroud) objective-c uiviewcontroller ios completionhandler ios-camera
我有带有 getContentInBackgroundWithMemberId 和 postRequest 函数的 RequestManager 类。我想从我的视图控制器调用它们并使用完成处理程序获取结果。如何编辑我的函数?
请求管理器
#import <Foundation/Foundation.h>
@interface RequestManager : NSObject
-(void)getContentInBackgroundWithMemberId:(int)memberId;
@end
Run Code Online (Sandbox Code Playgroud)
请求管理器
#import "RequestManager.h"
@implementation RequestManager
-(void)postRequestWithParams:(NSDictionary*)params
{
NSString *parameters = @"encrypt=93mrLIMApU1lNM619WzZje4S9EeI4L2L";
for(id key in params)
{
NSString *obj = [NSString stringWithFormat:@"&%@=%@",key,[params objectForKey:key]];
[parameters stringByAppendingString:obj];
}
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"http://someserver"]];
NSData *postBody = [parameters dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postBody];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if(!connectionError)
{
NSDictionary …Run Code Online (Sandbox Code Playgroud) 我知道这不行,因为它completion handler是在一个background Thread但是
我应该在哪里派遣主队列或我还需要做什么?
这是代码:
static func isNotificationNotDetermined() -> Bool{
var isNotDetermined = false
UNUserNotificationCenter.current().getNotificationSettings { (notificationSettings) in
switch notificationSettings.authorizationStatus {
case .notDetermined:
isNotDetermined = true
case .authorized:
isNotDetermined = false
case .denied:
isNotDetermined = false
}
}
return isNotDetermined
}
Run Code Online (Sandbox Code Playgroud) 想象一个具有多参数完成的方法:
fun foo(completion : (p1 : Int, p2 : Int) -> Unit){
completion(1, 2)
}
Run Code Online (Sandbox Code Playgroud)
通话时如何访问p1和p2 foo?
我究竟做错了什么?我有一个像这张图片中显示的那样的数据库结构。 
在 appleDelegate.swift 中,我只想检查“用户”节点下是否确实存在某个用户令牌。也就是说,如果“用户”具有子 currentUserID(字符串标记)。我了解observeSingleEvent 是异步执行的。我在swift 中收到此错误:“应用程序窗口应在应用程序启动结束时有一个根视图控制器”。在“func application(_ application:UIApplication”)中,我有这个代码。我在下面还有我的完成处理程序函数。
if let user = Auth.auth().currentUser{
let currentUserID = user.uid
ifUserIsMember(userId:currentUserID){(exist)->() in
if exist == true{
print("user is member")
self.window?.rootViewController = CustomTabBarController()
} else {
self.window?.rootViewController = UINavigationController(rootViewController: LoginController())
}
}
return true
} else {
self.window?.rootViewController = UINavigationController(rootViewController: LoginController())
return true
}
}
func ifUserIsMember(userId:String,completionHandler:@escaping((_ exists : Bool)->Void)){
print("ifUserIsMember")
let ref = Database.database().reference()
ref.child("users").observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.hasChild(userId) {
print("user exists")
completionHandler(true)
} else {
print("user doesn't exist") …Run Code Online (Sandbox Code Playgroud) 如果你从不调用完成处理程序会发生什么?有没有什么副作用?我假设可能存在内存泄漏,但我找不到任何文档。
func completeMe(completionHandler: @escaping (String?) -> Void) {
return
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个简单的程序,旨在与服务器通信,获取一些信息并显示它。但是,我遇到了异步代码的问题,主要是代码没有停止以允许服务器在继续之前做出响应。
我知道我一定做错了什么,但不知道是什么,非常感谢任何帮助。
override func viewDidLoad() {
super.viewDidLoad()
Task{
let accessToken = await getToken()
}
print("Done")
}
private func getToken() async -> String{
let url = URL(string: "https://api.petfinder.com/v2/oauth2/token")
let payload = "grant_type=client_credentials&client_id=GUQj1MdQN3QunoxXz4vdd0DHPlcJC6yuqCLCEXavriJ4W6wTYV&client_secret=7whgSG3ZX6m9Cwfr2vEakOH90fSn3g0isIlae0CC".data(using: .utf8)
var request = URLRequest(url: url!)
request.httpMethod = "POST"
request.httpBody = payload
do{
let (data,_) = try await URLSession.shared.data(for: request)
let APItoken: token = try! JSONDecoder().decode(token.self, from: data)
return APItoken.access_token
}
catch{
return ""
}
}
Run Code Online (Sandbox Code Playgroud) swift ×7
ios ×3
asynchronous ×2
objective-c ×2
alamofire ×1
android ×1
async-await ×1
firebase ×1
function ×1
healthkit ×1
ios-camera ×1
kotlin ×1