2013-06-26 3 views
0

Я ищу полное и полное объяснение лучшего способа получить фотографии профиля для друзей Facebook (чьи идентификаторы Facebook хранятся в массиве). В другом месте в моем приложении, я использую следующий код, чтобы получить изображение текущего пользователя:получение фотографий профиля Facebook для набора друзей в фоновом режиме

... 
... 
    // Create request for user's Facebook data 
    FBRequest *request = [FBRequest requestForMe]; 

    // Send request to Facebook 
    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
     if (!error) { 
      NSLog(@"no fb error"); 
      // result is a dictionary with the user's Facebook data 
      NSDictionary *userData = (NSDictionary *)result; 

      // Download the user's facebook profile picture 
      self.imageData = [[NSMutableData alloc] init]; // the data will be loaded in here 

      // URL should point to https://graph.facebook.com/{facebookId}/picture?type=large&return_ssl_resources=1 
      NSURL *pictureURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=square&return_ssl_resources=1", userData[@"id"]]]; 

      NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:pictureURL 
                     cachePolicy:NSURLRequestUseProtocolCachePolicy 
                    timeoutInterval:2.0f]; 
      // Run network request asynchronously 
      NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
      if (!urlConnection) { 
       NSLog(@"Failed to download picture"); 
      } 
     } 
    }];   
} 

// Called every time a chunk of the data is received 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [self.imageData appendData:data]; // Build the image 
} 

// Called when the entire image is finished downloading 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    [[PFUser currentUser] setObject:self.imageData forKey:@"image"]; 
    [[PFUser currentUser] saveInBackground]; 
} 

Этот подход, кажется, есть преимущество загрузки данных в фоновом режиме, но мне кажется, что это может быть сложно реализовать как часть цикла for, в котором я просматриваю набор друзей пользователя Facebook, чтобы получить их изображения профиля, так как он вызывает несколько методов делегатов, и тогда мне нужно будет отслеживать, какие данные изображения друга были получены в методах делегата ,

Было бы даже возможно отслеживать, какие данные изображения друга были получены в методах делегата, учитывая, что цикл цикла, повторяющийся через этих друзей, будет выполняться в основном потоке и завершен до того, как сбор данных завершится для предыдущего итерации (я считаю)?

Я предполагаю, что одним из способов решения этой проблемы будет выполнение цикла for for в фоновом потоке, где я не перебираю следующего друга, пока текущий не соберет все его данные. И тогда мне не нужно будет использовать асинхронный вызов NSURLConnection. И это, вероятно, упростит код совсем немного. Будет ли это хорошим решением, и если да, то как мне создать такой фоновый процесс?

Или какое другое решение вы рекомендуете?

ответ

1

метод использование NSURLConns: + (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler так:

// Create request for user's Facebook data 
FBRequest *request = [FBRequest requestForMe]; 

// Send request to Facebook 
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
    if (!error) { 
     NSLog(@"no fb error"); 
     // result is a dictionary with the user's Facebook data 
     NSDictionary *userData = (NSDictionary *)result; 

     // Download the user's facebook profile picture 
     self.imageData = [[NSMutableData alloc] init]; // the data will be loaded in here 

     // URL should point to https://graph.facebook.com/{facebookId}/picture?type=large&return_ssl_resources=1 
     NSURL *pictureURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=square&return_ssl_resources=1", userData[@"id"]]]; 

     NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:pictureURL 
                    cachePolicy:NSURLRequestUseProtocolCachePolicy 
                   timeoutInterval:2.0f]; 
     // Run network request asynchronously 
     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *resp, NSData *data, NSError *error) { 
      [[PFUser currentUser] setObject:data forKey:@"image"]; 
      [[PFUser currentUser] saveInBackground]; 
     }]; 
    } 
}];   

}

+0

но логика ускользает от меня .... вы это делаете для 200 друзей, но всегда для того же ключа PFUser .. так что только 1 изображение делает его для разбора –

+0

нет необходимости в нитке здесь .. all async –

+0

Спасибо. В моем сообщении упоминается: «В другом месте моего приложения я использую следующий код, чтобы получить изображение текущего пользователя:« Вот почему код в моем сообщении имеет только один PFUser. Похоже, что этот метод с обработчиком очереди и завершения должен быть хорошим решением. Я скоро сделаю это. – mkc842

0

Я не уверен, как это сделать, но я на 95% уверен в том, что это можно выполнить с помощью запроса FQL. Проверьте документацию FQL на FQL here. Цикл действительно не отличная идея, хотя есть способ, когда вы можете объединить несколько FBRequests в один большой FBRequestConnection и запустить все сразу - однако я бы посоветовал это сделать.

В одном из моих приложений я проверяю учетную запись друзей пользователей на мероприятии Facebook (перекрестные ссылки друзей пользователей снова список всех участников) - я делаю это с помощью запроса FQL. Я понимаю, что это не то, что вы хотите, однако это может помочь вам понять подход. Проверьте ответ на мой вопрос here.

Надеется, что это помогает ...

Смежные вопросы