我正在尝试更改块内 int 的值。(在这个代码示例中,SLRequest 本身只是我完整应用程序的上下文设置,预计不会在这里工作 - 只需编译并运行即可,以便我可以测试设置 int。Socialframework 需要包含在项目中为此编译示例。输出包括在下面。)
#import "MainViewController.h"
#import <Social/Social.h>
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// This SLRequest stuff is just to provide the context for the block in question below
NSString * theURLstr = @"http://someurl";
NSURL * theNSURL = [[NSURL alloc] initWithString:theURLstr];
SLRequest *theRequest = [SLRequest requestForServiceType: SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:theNSURL parameters:nil];
[theRequest setAccount:nil]; //
// This is our test value. We expect to be able to change it inside the following block
__block int test = 44;
NSLog(@"(BEFORE block) test is: %d", test);
[theRequest performRequestWithHandler:
^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error2)
{
// We get here late.
test = 27;
NSLog(@"(INSIDE block) test is: %d", test);
}];
// We get here fine, but test isn't changed
NSLog(@"(AFTER block) test is: %d", test);
}
// - - 输出:
2013-02-10 19:13:53.283 debugExp1[92743:c07] (BEFORE block) test is: 44
2013-02-10 19:13:53.285 debugExp1[92743:c07] (AFTER block) test is: 44
2013-02-10 19:13:53.312 debugExp1[92743:1303] (INSIDE block) test is: 27
注意无序的输出行。它在执行中间之前开始和结束。我怎样才能解决这个问题?我只想更改该位置的 int 值并让它在块外使用。
=== 更新 ===
我在网上找到了这个问题的多个切线版本,但对我的目的来说是不可用的形式。所以也许我以一种无法回答的方式提出我的问题。让我尝试添加一些上下文。
我的应用程序正在组装来自 Twitter 指定的不同类型的多个 Twitter API 调用的数据。我不是为了展示而建表。我只想要 ivars 中的数据并最终管理对象。除了获取 Twitter 数据之外,该应用程序还有很多工作要做,因此我不想将太多的应用程序结构放在单个 performRequestWithHandler 块中,这样我就可以在某个时候访问它返回的数据。对我来说,从网上获取数据是一种实用操作,而不是唯一的应用程序设计决定因素。我的一些 API 调用特别依赖于从之前以特定顺序执行的其他类型的 API 调用收集的数据。
我需要知道这些先前的调用何时完成,以便我可以使用从它们的数据对象中设置的 ivar 值。
也就是说,我需要一种方法来进行 API 调用#1,将各种返回数据分配给 ivars,在 performRequestWithHandler 块之外使用 ivars 做其他事情,根据调用 #1 进行 API 调用#2 和 #3 等和后续的 API 调用返回,并最终洗牌到其他 viewController 以各种方式显示来自多个 API 调用的返回值的处理数据。
我完全明白 performRequestWithHandler 是在一个未指定的线程上执行的,该线程将在我不知道何时执行。我不担心由于同步网络访问延迟而导致 UI 长时间等待,因为我打算指定非常短的等待时间。我不会让我的用户坐等慢速网络连接!如果连接速度很慢,我会短暂显示一个活动指示器并放弃快速等待以显示警报。应用程序的那部分不是我在这里关注的挑战。
我的挑战是在部分或全部完成后将来自多个 performRequestWithHandler 调用的返回数据组装在一个地方。
在我看来,performRequestWithHandler 的调用级别可能太高,无法实现我需要的那种同步控制和数据访问。我不知道。
上面的代码示例只是我能想到的以一种简单的编译方式隔离和演示我的问题的最简单方法。我已经尝试了很多变种,但到目前为止没有任何乐趣。
希望这有助于澄清我正在使用的设计理念。
感谢您提供的任何具体帮助、线索或想法。在这一点上,一个微小的工作代码示例将是天赐之物,但如果/当我找到一个解决方案时,我会继续努力并发布解决方案。