使用iOS 5的新TWRequest
API,我遇到了与块使用相关的砖墙。
我需要做的是在收到第一个请求的成功响应后,立即触发另一个请求。在第二个请求的完成块上,然后我通知多步操作的成功或失败。
以下是我正在做的事情:
- (void)doRequests
{
TWRequest* firstRequest = [self createFirstRequest];
[firstRequest performRequestWithHandler:^(NSData* responseData,
NSHTTPURLResponse* response,
NSError* error) {
// Error handling hidden for the sake of brevity...
TWRequest* secondRequest = [self createSecondRequest];
[secondRequest performRequestWithHandler:^(NSData* a,
NSHTTPURLResponse* b,
NSError* c) {
// Notify of success or failure - never reaches this far
}];
}];
}
我没有保留任何一个请求或在任何地方保留对它们的引用;它只是点不管用。
但是,当我运行该应用时,它会在EXC_BAD_ACCESS
上崩溃:
[secondRequest performRequestWithHandler:...];
它执行第一个请求就好了,但是当我尝试使用处理程序启动第二个请求时,它会崩溃。这段代码出了什么问题?
创建请求的方法非常简单:
- (TWRequest*)createFirstRequest
{
NSString* target = @"https://api.twitter.com/1/statuses/home_timeline.json";
NSURL* url = [NSURL URLWithString:target];
TWRequest* request = [[TWRequest alloc]
initWithURL:url parameters:params
requestMethod:TWRequestMethodGET];
// _twitterAccount is the backing ivar for property 'twitterAccount',
// a strong & nonatomic property of type ACAccount*
request.account = _twitterAccount;
return request;
}
答案 0 :(得分:18)
确保您保留引用/保留拥有ACAccountStore
所拥有ACAccount
的{{1}}来签署TWRequest
。
如果不这样做,ACAccount
将无效,然后您在尝试触发与其签名的TWRequest
时会获得EXC_BAD_ACCESS。
答案 1 :(得分:1)
我不熟悉TW *,所以请考虑这个猜测...尝试发送堆分配的块:
[firstRequest performRequestWithHandler:[^ (NSData *responseData, ...) {
...
} copy]];
为了澄清,我认为你发送的块是堆分配的,所以虽然TW *可能会保留它,如果它已经超出范围,它将没有任何区别