-1

我正在为我使用 ASIHTTPRequest 的旧应用程序进行更新。由于客户想要升级这个应用程序,我选择将我现有的项目转换为正在处理内存管理的“ ARC ”项目由应用程序本身。

由于ASIHTTPRequest在执行多个请求时出现了一些错误(以及 ASI 已过时的事实),我选择使用一个名为AFNetworking的新库。在将此当前项目设置转换为 AFNetworking 时,我遇到了问题。

在我当前的设置中,我对给定服务器执行了如下请求:

_request = [[ASIHTTPRequest alloc ] initWithURL:[NSURL URLWithString:url]];
[_request setShouldContinueWhenAppEntersBackground:NO];
[_request setDidFinishSelector:@selector(downloadPageHasFinished:)];
[_request setDidFailSelector:@selector(downloadPageHasFailed:)];
[_request setDelegate:self];
[_request startAsynchronous];
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:YES];

在上面的设置中,我一直在使用两个选择器(didFinish 和 didFailed),我可以在其中捕获我的(非)成功请求。在该选择器中,我将我的 responseData 传回给给定的父级。

[parent downloadCompleted:YES andContent:responseData];

现在我已经切换到 AFNetworking,我也想在其中执行请求并将 responseData 传回给给定的父级。由于 AFNetworking 使用块,我不确定何时或如何传回此 responseData。由于 web 服务返回 XML,我选择添加 KissXML 标头链接,它是 AFHTTPRequestOperation 的子类。现在我可以在我的块语句中检索我的完整 XML 文档(我想要的)。但我不知道如何将此数据返回到我的特定视图控制器(并且我可以同时执行多个请求)。我目前对 AFNetworking 的设置如下。

-(NSData *)doAFNetworkRequest:(NSURL *)url {
    __block NSData * datathingy = nil;

        AFKissXMLRequestOperation *operation = [AFKissXMLRequestOperation XMLDocumentRequestOperationWithRequest:[NSURLRequest requestWithURL:url] success:^(NSURLRequest *request, NSHTTPURLResponse *response, DDXMLDocument *XMLDocument) {
            NSLog(@"THE COMPLETE DOCUMENT: %@", XMLDocument);
            datathingy = [[XMLDocument description] dataUsingEncoding:NSUTF8StringEncoding];

            //the place where I can't return values

        } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, DDXMLDocument *XMLDocument) {


        }];

        [operation start];
    return datathingy;
}

当我放置“return datathingy”时;在成功块部分我收到错误:

“不兼容的块指针类型发送 'NSData *(^)(NSURLRequest * _strong, NSHTTPURLResponse * _strong, DDXMLDocument *_strong )' 到类型参数 'void (^)(NSURLRequest * _strong, NSHTTPURLResponse *_strong , DDXMLDocument * _strong )'"

那么我如何能够在我的块中返回该 NSData 对象,以便请求的视图控制器将接收正确的 responseData 并且不会收到 nil 值?

注意 1:我想将完整的 XML 文档传回给我的视图控制器,因为解析是在每个特定的视图控制器中处理的。所以只有将 responseData 传递给父 Viewcontroller 才应该这样做。

注意2:我已经找到了一个可以将 ASI 直接转换为 AF 的资源,但我不确定 AFNetworking 的这些附加标头是否支持我以前对 ASI 的所有需求(即缓存和/或 ASIHTTPRequest 的附加属性)。

4

1 回答 1

1

如果 doAFNetworkRequest 方法在 viewcontroller 类中,你可以简单地这样做:

-(void)doAFNetworkRequest:(NSURL *)url {
    __block NSData * datathingy = nil;
    __unsafe__unretained selfPointer = self;
    AFKissXMLRequestOperation *operation = [AFKissXMLRequestOperation XMLDocumentRequestOperationWithRequest:[NSURLRequest requestWithURL:url] success:^(NSURLRequest *request, NSHTTPURLResponse *response, DDXMLDocument *XMLDocument) {
        NSLog(@"THE COMPLETE DOCUMENT: %@", XMLDocument);
        datathingy = [[XMLDocument description] dataUsingEncoding:NSUTF8StringEncoding];

        [selfPointer parseXML:datathingy];

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, DDXMLDocument *XMLDocument) {


    }];

    [operation start];

}

但是把这个请求代码放在viewcontroller中是不好的。更好的方法是创建一个单例类来处理所有的网络请求。如果是这样,在该网络处理程序类中创建一个协议:

@protocol NetworkHandlerProtocol
-(void)requestSuccessWithData:(NSData *)data;
-(void)requestFailedWithError:(NSError *error);

和一个代表:

id<NetworkHandlerProtocol> delegate;

在 -(void)doAFNetworkRequest:(NSURL *)url 应该是这样的:

    __block NSData * datathingy = nil;

    AFKissXMLRequestOperation *operation = [AFKissXMLRequestOperation XMLDocumentRequestOperationWithRequest:[NSURLRequest requestWithURL:url] success:^(NSURLRequest *request, NSHTTPURLResponse *response, DDXMLDocument *XMLDocument) {
        NSLog(@"THE COMPLETE DOCUMENT: %@", XMLDocument);
        datathingy = [[XMLDocument description] dataUsingEncoding:NSUTF8StringEncoding];

        //the place where I can't return values
        [self.delegate requestSuccessWithData:datathingy];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, DDXMLDocument *XMLDocument) {


    }];
    [operation start];

然后在视图控制器中,当您执行请求时:

NetworkHandler *handler = [NetworkHandler sharedHander];
handler.delegate = self;
[handler doAfNetworkRequest:url];

//some where implement the protocol methods
-(void)requestSuccessWithData:(NSData *)data
{
    //you can do something with the return data here
}
于 2013-02-19T22:47:13.690 回答