2013-06-05 2 views
0

Я пытаюсь использовать AFJSONRequestOperation, чтобы вытащить один мир данных из канала JSON.AFJSONRequestOperation не обновляет содержимое за пределами блока

Следующий код тянет URL-адрес просто отлично, и когда stringURL печатается, он печатает правильный URL-адрес. Тем не менее, я пробовал несколько разных способов присвоения URL новой переменной, выходящей за рамки блока. Я пытаюсь назначить полученный URL-адрес другому глобальному NSURL (обязательно используйте __block) или попробуйте добавить его в массив, который, кажется, не обновляется вовремя для печати в NSLog. Я подозреваю, что это потому, что операция еще не закончена. Как я могу убедиться, что операция закончена, прежде чем я позвоню NSLog([streamUrls objectAtIndex:0]);?

Вот код, который я использую.

NSURL *url = [contentUrls objectAtIndex:indexPath.row]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSONSound) { 

    NSString *stringURL = [NSString stringWithFormat:@"%@", 
          JSONSound[@"stream_url"], nil]; 

    NSURL *streamURL = [NSURL URLWithString:stringURL]; 
    NSLog(stringURL); 
    [streamUrls addObject:streamURL]; 
    [self.collectionView reloadData]; 
} failure:nil]; 
[operation start]; 

NSLog([streamUrls objectAtIndex:0]); 

EDIT: [self.collectionView reloadData]; эта линия, кажется, не влияют на ситуацию.

ответ

3

Чтобы убедиться, что операция завершена, прежде чем сделать какой-либо вызов кода, вы можете использовать успех блок AFJSONRequestOperation, который является то, что вы делаете, когда вы добавлять объекты в streamUrls:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSONSound) { 
    NSString *stringURL = [NSString stringWithFormat:@"%@", 
         JSONSound[@"stream_url"], nil]; 

    NSURL *streamURL = [NSURL URLWithString:stringURL]; 
    NSLog(stringURL); 
    [streamUrls addObject:streamURL]; 
    [self.collectionView reloadData]; 
    NSLog([streamUrls objectAtIndex:0]); 
} failure:nil]; 

ReloadData не влияет на источник данных. Он просто обновляет представление коллекции, отображаемое на основе источника данных (обновляется ли источник данных или нет).