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

Так что заслуга ему тоже.

Другие вопросы по тегам