3

我正在尝试使用 SLRequest iOS API 获取 facebook 数据,这似乎工作正常 -

NSDictionary *parameters = @{};
NSURL *feedURL = [NSURL URLWithString:@"https://graph.facebook.com/me/home"];

SLRequest *feedRequest = [SLRequest 
    requestForServiceType:SLServiceTypeFacebook
    requestMethod:SLRequestMethodGET
    URL:feedURL 
    parameters:parameters];

feedRequest.account = facebookAccount;

[feedRequest performRequestWithHandler:^(NSData *responseData, 
       NSHTTPURLResponse *urlResponse, NSError *error)
{
    // something
}];

但是,在此之后,我向我的一台服务器发出 HTTP POST 请求,

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSData *requestData = [NSData dataWithBytes:[jsonData bytes] length:[jsonData length]];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody: requestData];
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

POST数据很好(从服务器日志验证),但我没有得到任何HTTP响应

connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response

在没有 SLRequest POST 的情况下,这曾经可以正常工作,我可以评论该部分并再次开始工作。

我在这里想念什么?

4

2 回答 2

2

您如何创建对您的 NSURLConnection 的强引用,我猜 iOS 正在释放该对象,所以这就是您的委托永远不会被调用的原因。

所以,而不是:

NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

利用:

self.connection=[[NSURLConnection alloc]initWithRequest:request delegate:self];

在哪里:

@property(nonatomic, strong)NSURLConnection * connection;

让我知道进展如何,干杯。

亲切的问候

于 2013-12-02T23:46:30.217 回答
1

对我有用的修复方法是不使用 SLRequest 块加载,而是在第一时间使用 NSURLConnection 和适当的 NSURLConnectionDelegate 方法。第二次使用此委托时,加载应该没问题,尝试将所有加载保持在同一个实用程序类中,以便它们共享同一个委托。对我来说,这是 twitters v1.1 API 的问题。

因此,在您的代码中尝试删除该块,然后您需要准备 SLRequest:

urlData=[[NSData alloc] init];
// change that SLRequest to a NSURLRequest
NSURLRequest *request = [feedRequest preparedURLRequest];
dispatch_async(dispatch_get_main_queue(), ^{
    [NSURLConnection connectionWithRequest:request delegate:self];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});

然后使用 NSURLConnectionDelegate 方法,捕获加载的 NSData:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    connection=nil;
    NSError *jsonParsingError = nil;
    NSMutableDictionary *deserializedData  = [NSJSONSerialization JSONObjectWithData:urlData options:NSJSONReadingAllowFragments error:&jsonParsingError];
    if (deserializedData) {
         // handle the loaded dictionary as you please
    } 
}

此修复程序的灵感来自 Keith Harrison 的帖子:http ://useyourloaf.com/blog/2013/06/24/migrating-to-the-new-twitter-search-api.html

所以功劳也归于他。

于 2013-11-26T12:37:26.410 回答