如何在Objective-C iOS中等待完成块完成

光盘

我有两个方法的子类:

- (void) aPostRequest:(NSString *) urlStr andJSON:(NSMutableDictionary*) jsonDict completion:(void (^)(NSDictionary *, NSError *))completion
{
    NSError *error = nil;

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

    [request setHTTPMethod:@"POST"];

    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];

    // Set up the post data
    NSData *postData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:nil];
    [request setHTTPBody:postData];

    // dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        if (!error)
        {
            // convert the NSData response to a dictionary
            NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

            if (error)
            {
                // There is a parse error
                completion(nil, error);
            }
            else
            {
                // Success
                completion(dictionary, nil);
            }
        }
        else
        {
            // Error from the session
            completion(nil, error);
        }
        // dispatch_semaphore_signal(semaphore);
    }];
    // dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    [postDataTask resume];
}

这个调用上面方法的方法:

- (NSString *) verifyUnique
{
    // JSON data
    __block NSString *verifyUnique = nil;

    // dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    // URL string
    NSString *url = @"https://the-website-to-handle-this.com";
    NSMutableDictionary *json = [[NSMutableDictionary alloc] init];
    [json setValue:@"testing" forKey:@"name"];

    [self aPostRequest:url andJSON:json completion:^(NSDictionary *response, NSError *error)
     {
         // dispatch_semaphore_signal(semaphore);

         if (!error) {

         } else {  

             verifyUnique = [response objectForKey:@"uniqueness"]; 

             // return verifyUnique;
             // dispatch_semaphore_signal(semaphore);
         }
     }];

    // dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    return verifyUnique;
}

我从另一个视图控制器类调用该函数,然后调用[thisClass verifyUnique];并希望它等待直到返回答案。在视图控制器中调用UI之前,需要先使用活动指示器来处理UI,以便我们等待。我如何等待两个完成块都返回?

质子
- (void *) verifyUniqueCompletion:(void (^)(NSString *result, NSError *error))completion
{
    // JSON data
    __block NSString *verifyUnique = nil;

    // dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    // URL string
    NSString *url = @"https://the-website-to-handle-this.com";
    NSMutableDictionary *json = [[NSMutableDictionary alloc] init];
    [json setValue:@"testing" forKey:@"name"];

    [self aPostRequest:url andJSON:json completion:^(NSDictionary *response, NSError *error)
     {
         // dispatch_semaphore_signal(semaphore);

         if (!error) {
             completion(nil, error);
         } else {  

             verifyUnique = [response objectForKey:@"uniqueness"]; 

             completion(verifyUnique, nil);
             // return verifyUnique;
             // dispatch_semaphore_signal(semaphore);
         }
     }];

    // dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

}

用这个:

[thisClass verifyUniqueCompletion:^(NSString *result, NSError) {
    NSLog(@"result: ", result);
}];

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在iOS中等待NSXMLParser完成

如何在objective-c中的完成块上传递参数

如何编写一个Objective-C完成块

如何在C#中等待主线程直到异步任务完成

如何在 C++ 中等待一组线程完成或其他事件

iOS / Objective-c:从完成块或闭包异步返回值到调用函数

如何在Objective-C和Swift中等待

可以从Objective-C使用的带有完成块的方法

如何创建与Objective-C完成块等效的C ++作为参数

如何在快速路线中等待功能完成

如何在flutter中等待异步函数完成处理

如何在Kubernetes中等待发布完成

如何在GO中等待POST请求完成?

如何在循环的每次迭代中等待异步操作完成

如何在角度 4 中等待函数完成?

如何在无限循环中等待函数完成?

如何在组件中等待服务HTTP调用完成

如何在Flutter小部件测试中等待将来完成?

NodeJS:如何在For Loop中等待HTTP Get请求完成?

如何在反应中等待 JavaScript 函数完成?

如何在Powershell中等待TFS Build Queued完成

如何在javascript中等待函数完成?

如何在Obj C中编写没有完成块的异步方法的单元测试

在Objective-C中使用带有可为空的String值的Swift完成块

是否可以将完成块传递给Objective-C中的委托参数?

如何使我的主要代码/表单在C#中等待另一个类的函数完成而不会冻结?

如何在React中等待数据通过异步/等待完成获取

如何调用完成块?

如何在剧作家中等待JavaScript完成