Ios 模型、块和完成处理程序哦,天哪

Ios 模型、块和完成处理程序哦,天哪,ios,objective-c,objective-c-blocks,completionhandler,Ios,Objective C,Objective C Blocks,Completionhandler,我从零开始学习iOS编程 我想让我的应用程序从网站中提取XML。我认为,为了符合MVC模式,我应该有一个模型类,它只提供一个方法来实现这一点(也许让它也解析XML并返回一个数组) 问题是,我找到的所有教程都在视图和控制器的上下文中教授NSURLSession,所以编辑appdelegate,或者创建视图控制器,等等 我从苹果的文档中获得了以下方法,目前我在按下按钮时将其作为iAction运行(因此我可以轻松地运行和测试它)。我想让它工作,然后把它放在自己的类中: __block NSMutabl

我从零开始学习iOS编程

我想让我的应用程序从网站中提取XML。我认为,为了符合MVC模式,我应该有一个模型类,它只提供一个方法来实现这一点(也许让它也解析XML并返回一个数组)

问题是,我找到的所有教程都在视图和控制器的上下文中教授NSURLSession,所以编辑appdelegate,或者创建视图控制器,等等

我从苹果的文档中获得了以下方法,目前我在按下按钮时将其作为iAction运行(因此我可以轻松地运行和测试它)。我想让它工作,然后把它放在自己的类中:

__block NSMutableData *webData;

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];
[[delegateFreeSession dataTaskWithURL: [NSURL URLWithString:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSLog(@"Got response %@ with error %@.\n", response, error);
    NSLog(@"DATA:\n%@\nEND DATA\n", [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]);
        webData = [[NSMutableData alloc] initWithData:data];
}
]resume];
我眼前的问题是:

有人能解释一下完成处理程序是如何工作的,以及如何从中获取数据吗?它正在工作,数据从网站抓取xml并将其记录在控制台上,但将其复制到
webData
不起作用,它编译但不复制。(我还在想为什么
\u块
声明首先允许
webData
潜入其中!)

我更大的问题是,是否每个人都认为为这个过程创建一个单独的模型类是个好主意。有没有更好的设计方法


谢谢大家!

这可能只是对异步块如何工作的一些困惑。如果您正在这样做:

__block NSMutableData *webData;
// ...

[[delegateFreeSession dataTaskWithURL: [NSURL URLWithString:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSLog(@"within the block, did I get data: %@", data);
    webData = [[NSMutableData alloc] initWithData:data];
}]resume];

NSLog(@"after the block, did I get data: %@", webData);
您可能会看到如下输出:

after the block, did I get data: (null)
within the block, did I get data: <NSData ...

也许你可以。这里的答案可以给你一个提示,什么地方出了问题。我已经看过那页了。我已经在使用一个无代理会话,所以我不确定它如何适用。。。另外,我的完成处理程序正在执行,我根本不知道如何从中获取数据。你说的“复制”是什么意思?我的意思是
webData=[[NSMutableData alloc]initWithData:data]
没有将信息从
数据
复制到
网络数据
。我想按值传递,我想这就是
initWithData
要做的。我试图在块之后(之前)记录它。我不明白的是,如果我不能在块中使用class属性,如何将它保存在类的属性中?这有意义吗?很抱歉,如果这应该是显而易见的,但我对这一点真的很陌生。因此,我已经在块中成功地将
数据
解析为一个对象数组(甚至不需要
webData
。现在我如何将该数组从块中取出并返回给调用者?@maybnotbe-您可以在该块中放置任何您想要的代码。您通常在方法中放置的任何代码都可以。请参阅编辑。谢谢。我理解。我想我的问题是即使我可以执行
[self.property=data]
self.property
在我需要时仍然是空的,无论我如何尝试,我都没有想到如何“赶上”它。该属性是否声明为
@property(强,非原子)NSData*属性;
// don't do this
//__block NSMutableData *webData;
// ...

[[delegateFreeSession dataTaskWithURL: [NSURL URLWithString:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSLog(@"within the block, did I get data: %@", data);
    NSMutableData *webData = [[NSMutableData alloc] initWithData:data];
    // do whatever you plan to do with web data
    // write it to disk, or save it in a property of this class
    // update the UI to say the request is done

    [self callAMethod:data];     // fine
    [self callAnotherMethod];    // fine
    self.property = data;        // fine
}]resume];

// don't do this, there's no data yet
//NSLog(@"after the block, did I get data: %@", webData);