Facebook SL Просьба возиться с NSURLConnection
Я пытаюсь получить данные Facebook, используя SLRequest iOS API, который, кажется, работает нормально -
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];
который помещает данные в порядке (проверено из журналов сервера), но я не получаю никакого ответа HTTP для него в
connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response
Раньше это работало нормально без SLRequest POST, и я могу прокомментировать этот кусок, и он снова начинает работать.
Что мне здесь не хватает?
2 ответа
Как насчет создания строгой ссылки на NSURLConnection, я думаю, что iOS выпускает этот объект, поэтому ваш делегат никогда не будет вызван.
Итак, вместо:
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
Использование:
self.connection=[[NSURLConnection alloc]initWithRequest:request delegate:self];
Куда:
@property(nonatomic, strong)NSURLConnection * connection;
Дайте мне знать, как это происходит, ура.
С уважением
Исправление, которое работает для меня, это не использовать загрузку блока SLRequest и использовать NSURLConnection с соответствующими методами NSURLConnectionDelegate в первых моментах. Во второй раз, когда вы используете этот делегат, загрузка должна быть в порядке, попробуйте сохранить всю загрузку в одном и том же классе утилит, чтобы они использовали один и тот же делегат. Для меня это были проблемы с API твиттеров v1.1.
Так что в вашем коде попробуйте удалить блок, а затем вам нужно подготовить 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
}
}
Это исправление было навеяно публикацией Кита Харрисона по адресу: http://useyourloaf.com/blog/2013/06/24/migrating-to-the-new-twitter-search-api.html
Так что заслуга ему тоже.