Tag: completionhandler

如何正确使用完成处理程序

我明白完成处理程序是如何工作的,但是在语法上有点混乱。 下面是一个函数,给定一个用户名,调用一个分析查询找出相应的userId。 查询结束后函数返回(所以它返回nil),这就是为什么我们需要完成处理程序。 我如何实现它? func getUserIdFromUsername(username: String) -> String { var returnValue = String() let query = PFQuery(className: "_User") query.whereKey("username", equalTo: username) query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in if let objects = objects { for object in objects { returnValue = object.objectId! } } } return returnValue } 注:我知道类似的例子存在,但他们要么不快,要么非常冗长。 这是一个简短的,包含Parse的版本。

方法在完成处理程序之前返回

我正在为我的项目开发一个networkUtil,我需要一个获取url的方法,并使用NSURLSessionDataTask从该URL返回从该服务器获取JSON的JSON。 方法如下: + (NSDictionary*) getJsonDataFromURL:(NSString *)urlString{ __block NSDictionary* jsonResponse; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:urlString] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@", jsonResponse); }]; [dataTask resume]; return jsonResponse; } 问题是在我的方法和方法本身的completionHandler运行在不同的线程和最后一行jsonResponse总是零 我应该如何设置jsonResponse从urlString返回的json? 这个问题的最佳做法是什么?

Alamofire Post请求之后如何获得完成处理程序/块?

我有一个处理Apple Push Notification Service远程通知的方法。 当这个方法被执行时,我希望它调用我的服务器,并使用Alamofire库进行HTTP POST请求。 我想执行另一个方法来处理POST请求的响应。 我的问题是,我正在使用现有的API从这个POST请求中的服务器获取configuration文件。 所以我需要使用这个现有的API,并找出何时从远程通知中明确触发了此configuration文件提取。 由于Alamofire请求是在后台队列中完成的,在从服务器接收到configuration文件后,如何执行方法? 什么是解决这个问题的好select? 谢谢!

从自定义类pipe理NSURLSession的完成处理程序

我的应用程序的一部分处理基于提供给他们的唯一代码为用户创build一个login检查。 为了使我的应用程序结构合理,我创build了一个networking助手类来处理所有的networking操作。 这里是我如何从控制器类(ViewController.m)调用我的助手类。 [[LoginNetworkHelper alloc] loginBasedOnPatientId:@"abc"]; 我的LoginNetworkHelper类执行以下任务(LoginNetworkhelper.m) – (BOOL)loginBasedOnPatientId:(NSString *)patientId { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://test.php"]]; [request setHTTPMethod:@"POST"]; //creating json string to send to server NSDictionary *patientData = [NSDictionary dictionaryWithObjectsAndKeys:@"002688727",@"value",@"prem_key_id",@"name", nil]; NSMutableArray *dataArr = [[NSMutableArray alloc] init]; [dataArr addObject:patientData]; NSError *error; NSData *jsonData2 = [NSJSONSerialization dataWithJSONObject:dataArr options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonString = [[NSString alloc] initWithData:jsonData2 […]

当应用程序从后台移除或重启设备时,使用NSURLSession恢复任务

我已经检查了很多文档,但是在应用程序从后台删除或重启设备时找不到使用NSURLSession恢复任务的解决scheme。 我正在处理亚马逊S3上传一些文件,在这我能够 当应用程序处于前景以及后台时,使用NSURLSessionUploadTask将file upload到S3。 当上传时由于任何其他原因应用程序崩溃 ,并且如果应用程序未从后台移除,则继续任务 。 重新启动任务,如果我重新启动设备,而上传,如果应用程序不会从后台删除。 这里是我的代码,以appdelegate的applicationDidBecomeActive方法编写的恢复function。 // Initialize session config and the background session NSURLSession *l_taskSession = [self backgroundSession]; [l_taskSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { if([uploadTasks count]) { for (int i=0; i<[uploadTasks count]; i++) { NSURLSessionUploadTask *uploadRequestTask = (NSURLSessionUploadTask*)[uploadTasks objectAtIndex:i]; [uploadRequestTask resume]; NSLog(@"——– Upload Resumed ——- "); } } else […]

iOS 7完成处理程序永远不会被调用

在下面的代码中,没有一个完成处理程序被执行。 我能find的一个解释是iPhone Simulator 5.1中的这个Bug,使用UIManagedDocument的Xcode 4.5 。 它说这可能是iPhone模拟器5.1中的一个错误。 不过,我试过iPhone模拟器6.0,6.1和7.0,他们都没有工作。 我会很感激你的帮助。 (顺便说一下,我在斯坦福iOS课程中看到了这个代码,第14讲) NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; url = [url URLByAppendingPathComponent:@"DataDocument"]; UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url]; if(![[NSFileManager defaultManager] fileExistsAtPath:[url path]]){ NSLog(@"This logs"); [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){ NSLog(@"This never logs"); }]; }else if(document.documentState == UIDocumentStateClosed){ NSLog(@"This logs"); [document openWithCompletionHandler:^(BOOL success){ NSLog(@"This never logs"); […]

在下一个方法被调用之前,代码没有完成

在我的iOS应用程序中,我使用forecast.io API获取了3天的天气预报。 一旦我从所有3中获得数组,我想创build一个NSMutableArray并将所有这些对象添加到它。 我得到的问题是它试图在预测数据被检索之前创buildNSMutableArray。 这是我到目前为止: typedef void(^myCompletion)(BOOL); -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; [self myMethod:^(BOOL finished) { if(finished){ NSMutableArray *allOfIt = [[NSMutableArray alloc] initWithObjects:self.weatherSaturday, self.weatherSunday, self.weatherMonday, nil]; NSLog(@"%@", allOfIt); } }]; } -(void) myMethod:(myCompletion) compblock{ //do stuff ForecastKit *forecast = [[ForecastKit alloc] initWithAPIKey:@"MY-API-KEY"]; // Request the forecast for a location at a specified time [forecast getDailyForcastForLatitude:37.438905 longitude:-106.886051 […]

如果用户按下取消,UIActivityViewController完成处理程序仍然调用操作

在我的UIActivityViewController中,我使用完成处理程序来执行“成功共享”通知。 它的工作原理,但我唯一的问题是,它仍然显示通知,如果用户按取消。 这是我的完成处理程序代码, [controller setCompletionHandler:^(NSString *activityType, BOOL completed) { CWStatusBarNotification *notification = [CWStatusBarNotification new]; [notification displayNotificationWithMessage:@"✓ Successfully Shared Centre!" forDuration:3.0f]; notification.notificationLabelBackgroundColor = [UIColor colorWithRed:38.0f/255.0f green:81.0f/255.0f blue:123.0f/255.0f alpha:1.0f]; notification.notificationLabelTextColor = [UIColor whiteColor]; }]; 谢谢您的帮助!

在函数外使用来自Alamofire请求的值

我似乎无法弄清楚这一个:我试图从我的服务器(在JSON中)使用Alamofire请求的错误,但我不能得到该函数以外的值。 这是我的function的实现: 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 […]

Swift 3:closures使用非转义参数可能会让它逃脱

我有以下function,我有完成处理程序,但我得到这个错误: Closure use of non-escaping parameter may allow it to escape 这是我的代码: func makeRequestcompletion(completion:(_ response:Data, _ error:NSError)->Void) { let urlString = URL(string: "http://someUrl.com") if let url = urlString { let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, urlRequestResponse, error) in completion(data, error) // <– here is I'm getting the error }) task.resume() } } 你们谁都知道我为什么得到这个错误? […]