使用 xCode 进行异步调用

用户2908751

我有另一个与 xCode 相关的初学者问题。我对 iOS 开发完全陌生,所以我感谢你们回复我。

我编写了以下类来访问 Restful API。如果我直接在调用方法中编写“makePostRequest”方法中的代码,它就可以正常工作。但是,我想让它异步,我不知道如何使这项工作异步。有人可以帮我把它写成异步调用吗?

#import <Foundation/Foundation.h>
#import "ServerRequest.h"
#import "NetworkHelper.h"

@implementation ServerRequest

@synthesize authorizationRequest=_authorizationRequest;
@synthesize responseContent=_responseContent;
@synthesize errorContent=_errorContent;
@synthesize url=_url;
@synthesize urlPart=_urlPart;
@synthesize token=_token;

- (void)makePostRequest : (NSString *) params   {
    NSString *urlString = [NSString stringWithFormat:@"%@%@", [self getUrl], [self getUrlPart]];

    NSURL *url = [NSURL URLWithString:urlString];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:[NSOperationQueue mainQueue]];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];

    if([self isAuthorizationRequest])    {
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        [request setValue:@"Basic" forHTTPHeaderField:@"Authorization"];
    }
    else    {
        NSString *authorizationValue = [NSString stringWithFormat:@"Bearer %@", [self getToken]];
        [request setValue:authorizationValue forHTTPHeaderField:@"Authorization"];
    }

    if(params.length > 0)
        [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];

    @try {
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                                    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)  {
                                                        if(error)   {
                                                            NSLog(@"Error: %@", error);
                                                        }
                                                        if([response isKindOfClass:[NSHTTPURLResponse class]])  {
                                                            NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
                                                            if(statusCode == [NetworkHelper HTTP_STATUS_CODE])  {
self.responseContent = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
error:nil];
                                                            }
                                                            else    {
self.errorContent = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
error:nil];
                                                            }
                                                        }
                                                    }];
        [dataTask resume];
    }

    @catch (NSException *exception) {
        NSLog(@"Exception while making request: %@", exception);
    } @finally {
        NSLog(@"finally block here");
    }
}

- (void)setAuthorization : (bool)value  {
    self.authorizationRequest = &value;
}

- (bool)isAuthorizationRequest  {
    return self.authorizationRequest;
}

- (NSDictionary *)getResponseContent    {
    return self.responseContent;
}

- (NSDictionary *)getErrorContent   {
    return self.errorContent;
}

- (void)setToken:(NSString *)token  {
    self.token = token;
}

- (NSString *)getToken  {
    return self.token;
}

- (void)setUrl:(NSString *)value  {
    //self.url = value;
    _url = value;
}

- (NSString *)getUrl    {
    return self.url;
}

- (void)setUrlPart:(NSString *)value  {
    self.urlPart = value;
}

- (NSString *)getUrlPart    {
    if(self.urlPart.length == 0)
        return @"";

    return self.urlPart;
}

@end
奈姆

我给你一个例子,你可以如何让你的方法在可用时为你提供数据。它是block基于。所以你不必在这里考虑异步任务。

首先在您的 中定义您的完成块ServerRequest.h

typedef void(^myCompletion)(NSDictionary*, NSError*);

并将您的方法的签名更改为:

- (void) makePostRequest:(NSString *)params completion: (myCompletion)completionBlock;

现在将您的方法的实现更改为这样的(我只是发布您的@try块,所以只需更改您的 try 块。其他保持不变)

@try {
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)  {
                                                    if(error) {
                                                        NSLog(@"Error: %@", error);
                                                        if (completionBlock) {
                                                            completionBlock(nil, error);
                                                        }
                                                    }
                                                    if([response isKindOfClass:[NSHTTPURLResponse class]]) {
                                                        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
                                                        if(statusCode == [NetworkHelper HTTP_STATUS_CODE]) {
                                                            NSError *error;
                                                            self.responseContent = [NSJSONSerialization JSONObjectWithData:data
                                                                                                                   options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
                                                                                                                     error:&error];
                                                            if (completionBlock) {
                                                                if (error == nil) {
                                                                    completionBlock(self.responseContent, nil);
                                                                } else {
                                                                    completionBlock(nil, error);
                                                                }
                                                            }
                                                        } else {
                                                            NSError *error;
                                                            self.errorContent = [NSJSONSerialization JSONObjectWithData:data
                                                                                                                options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
                                                                                                                  error:&error];
                                                            if (completionBlock) {
                                                                if (error == nil) {
                                                                    completionBlock(self.errorContent, nil);
                                                                } else {
                                                                    completionBlock(nil, error);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }];
    [dataTask resume];
}

最后,当您从其他地方调用此方法时,请将其用作:

[serverRequestObject makePostRequest:@"your string" completion:^(NSDictionary *dictionary, NSError *error) {
    // when your data is available after NSURLSessionDataTask's job, you will get your data here
    if (error != nil) {
        // Handle your error
    } else {
        // Use your dictionary here
    }
}];

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Java线程进行异步调用

来自分类Dev

如何使用Express和Node进行异步调用

来自分类Dev

使用React.useMemo进行异步调用

来自分类Dev

在PCL中使用HttpClient进行异步调用

来自分类Dev

如何使用AngularJs和Typescript进行异步调用

来自分类Dev

使用cljs-ajax进行异步调用

来自分类Dev

使用 react native 和 redux 进行异步调用,thunk

来自分类Dev

使用Angular在完成一堆异步调用后如何进行调用

来自分类Dev

如何使用回调在Swift中进行异步调用,以使主UI不挂起?

来自分类Dev

使用Oracle.DataAccess(ODAC)在C#中进行异步调用

来自分类Dev

使用react-router成功进行异步调用后如何重定向?

来自分类Dev

使用promise和defer在angularJS中进行同步和异步调用

来自分类Dev

如何在axest中正确使用axios.get.mockResolvedValue进行异步调用

来自分类Dev

使用事件发射器和服务进行跨组件通信的角度异步调用

来自分类Dev

使用axios.CancelToken之后如何进行异步调用?

来自分类Dev

如何使用async和await关键字进行异步调用

来自分类Dev

使用Oracle.DataAccess(ODAC)在C#中进行异步调用

来自分类Dev

使用异步调用自动重新登录

来自分类Dev

已使用异步调用回调?

来自分类Dev

如何使用 mockito 存根异步调用?

来自分类Dev

使用 Promise 共享异步调用的结果

来自分类Dev

通过许多异步调用在WebAPI中使用异步

来自分类Dev

调用异步方法时,StreamWriter使用同步调用

来自分类Dev

使用Ajax对数据库进行异步调用时,ERR_CONNECTION_RESET *仅*-CakePHP

来自分类Dev

使用angular.js ui和bootstrap typeahead进行异步调用以检索自动搜索建议

来自分类Dev

使用Ajax对数据库进行异步调用时,ERR_CONNECTION_RESET *仅*-CakePHP

来自分类Dev

进行骆驼异步调用

来自分类Dev

使用异步调用时异常处理的良好模式

来自分类Dev

使用异步调用时,实体框架挂起

Related 相关文章

  1. 1

    使用Java线程进行异步调用

  2. 2

    如何使用Express和Node进行异步调用

  3. 3

    使用React.useMemo进行异步调用

  4. 4

    在PCL中使用HttpClient进行异步调用

  5. 5

    如何使用AngularJs和Typescript进行异步调用

  6. 6

    使用cljs-ajax进行异步调用

  7. 7

    使用 react native 和 redux 进行异步调用,thunk

  8. 8

    使用Angular在完成一堆异步调用后如何进行调用

  9. 9

    如何使用回调在Swift中进行异步调用,以使主UI不挂起?

  10. 10

    使用Oracle.DataAccess(ODAC)在C#中进行异步调用

  11. 11

    使用react-router成功进行异步调用后如何重定向?

  12. 12

    使用promise和defer在angularJS中进行同步和异步调用

  13. 13

    如何在axest中正确使用axios.get.mockResolvedValue进行异步调用

  14. 14

    使用事件发射器和服务进行跨组件通信的角度异步调用

  15. 15

    使用axios.CancelToken之后如何进行异步调用?

  16. 16

    如何使用async和await关键字进行异步调用

  17. 17

    使用Oracle.DataAccess(ODAC)在C#中进行异步调用

  18. 18

    使用异步调用自动重新登录

  19. 19

    已使用异步调用回调?

  20. 20

    如何使用 mockito 存根异步调用?

  21. 21

    使用 Promise 共享异步调用的结果

  22. 22

    通过许多异步调用在WebAPI中使用异步

  23. 23

    调用异步方法时,StreamWriter使用同步调用

  24. 24

    使用Ajax对数据库进行异步调用时,ERR_CONNECTION_RESET *仅*-CakePHP

  25. 25

    使用angular.js ui和bootstrap typeahead进行异步调用以检索自动搜索建议

  26. 26

    使用Ajax对数据库进行异步调用时,ERR_CONNECTION_RESET *仅*-CakePHP

  27. 27

    进行骆驼异步调用

  28. 28

    使用异步调用时异常处理的良好模式

  29. 29

    使用异步调用时,实体框架挂起

热门标签

归档