使用sendAsynchronousRequest:queue:completionHandler:用于URL请求

我正在开发另一个开发人员创build的iOS应用程序的更新。 他使用ASIHTTPRequest处理http请求。 但是,我的应用程序版本必须与崩溃。 由于ASIHTTPRequest不再被更新,所以我认为我应该改用AFNetworking,但对于我来说这太复杂了。

所以最后我以为我可以自己使用NSURLConnection。

这是我想要replace的原始代码:

-(NSArray*)readUTF16LEFeed:(NSURL*) urlToRead{ ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:urlToRead]; [request startSynchronous]; NSError *error = [request error]; if (!error) { lastModified = [NSDate date]; NSData *response = [request responseData];//UTF-16LE NSString* responseString = [[NSString alloc] initWithData:response encoding:NSUTF16LittleEndianStringEncoding]; DLog(@"string is: %@",responseString); responseString = [responseString stringByReplacingOccurrencesOfString:@"ISO-8859-1" withString:@"UTF16-LE"]; NSData* data = [responseString dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; return [self parseNamesFromXML:data]; } return nil; } 

这就是我正在尝试使用的:

 -(NSArray*)readUTF16LEFeed:(NSURL*) urlToRead{ NSURLRequest *request = [NSURLRequest requestWithURL:urlToRead]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error ) { if ([data length] >0 && error == nil) { // DO YOUR WORK HERE lastModified = [NSDate date]; // NSData *response = [request responseData];//UTF-16LE NSString* responseString = [[NSString alloc] initWithData:data encoding: NSUTF16LittleEndianStringEncoding]; DLog(@"string is: %@",responseString); responseString = [responseString stringByReplacingOccurrencesOfString:@"ISO-8859-1" withString:@"UTF16-LE"]; NSData* data = [responseString dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; return [self parseNamesFromXML:data]; } else if ([data length] == 0 && error == nil) { NSLog(@"Nothing was downloaded."); } else if (error != nil){ NSLog(@"Error = %@", error); } }]; return nil; } 

但是,我得到的错误“不兼容的块指针types发送NSArray的参数的types为空,也”控制可能会达到非空块的结束。

我怎样才能使这个工作?

使你的方法返回types为void。 不要回报任何东西。 只需调用[self parseNamesFromXML:data]; 方法。

 -(void)readUTF16LEFeed:(NSURL*) urlToRead{ NSURLRequest *request = [NSURLRequest requestWithURL:urlToRead]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error ) { if ([data length] >0 && error == nil) { // DO YOUR WORK HERE lastModified = [NSDate date]; // NSData *response = [request responseData];//UTF-16LE NSString* responseString = [[NSString alloc] initWithData:data encoding: NSUTF16LittleEndianStringEncoding]; DLog(@"string is: %@",responseString); responseString = [responseString stringByReplacingOccurrencesOfString:@"ISO-8859-1" withString:@"UTF16-LE"]; NSData* data = [responseString dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; [self parseNamesFromXML:data]; } else if ([data length] == 0 && error == nil) { NSLog(@"Nothing was downloaded."); } else if (error != nil){ NSLog(@"Error = %@", error); } }]; } 

parseNamesFromXML方法中,处理结果并将结果数组分配给属性。 你可以随时随地访问它。

 -(void) parseNamesFromXML:(NSData *)xmlData { NSError *error; //DLog(@"data is %@", [[NSString alloc] initWithData:xmlData encoding:NSUTF8StringEncoding ]); GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error]; if (doc) { self.dataArray = [self parseXmlDoc:doc]; } } 

完成块被asynchronous调用,所以当你的代码到达时return [self parseNamesFromXML:data]; 方法范围已经完成(意味着方法返回nil。

尝试使用[NSURLConnection sendSynchronousRequest:returningResponse:error:]来代替,因为原始代码也是同步的。

编辑:正如朱利安Królbuild议,如果你返回一个块内的东西,它将被计为这个块的返回值,而不是原来的方法。 但是由于该块没有返回值,你会得到编译器错误。