2

私はスタンフォードcs 193 pの割り当てを受けていました5.問題は、データを宛先ビューコントローラーにセグし、ディスパッチキューを使用してviewDidLoadメソッドでデータをフェッチするときです.dispatch_asyncは宛先ビューコントローラーで実行されません.ビューコントローラーAと宛先ビューコントローラーの場合。

ビューコントローラーAコード

-(void)viewDidLoad
{
[super viewDidLoad];

if(!self.places){

    self.spinner.hidesWhenStopped = YES;
    self.spinner.center = self.tableView.center;//
    [self.view addSubview:self.spinner];
    [self.spinner startAnimating];


    dispatch_queue_t dispatchQueue = dispatch_queue_create("queue_top_places", NULL);
    dispatch_async(dispatchQueue, ^{

        self.places = [self getRecentPlacesFromFlicker];


        // main queue to load table view data
        dispatch_async(dispatch_get_main_queue(), ^{


            // load table data
            if(self.tableView.window){

                [self.tableView reloadData];
                [self.spinner stopAnimating];
            }
        });
    });

    dispatch_release(dispatchQueue);

}
// Uncomment the following line to preserve selection between presentations.
 self.clearsSelectionOnViewWillAppear = YES;

}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

if([segue.identifier isEqualToString:@"Show Recent Photo List"]){


    int currentRow = self.tableView.indexPathForSelectedRow.row;

    // set up photo list controller model

    [segue.destinationViewController setPhotosList:[self.places objectAtIndex:currentRow]];

    }               
}

これが宛先View Controllerのコードです

- (void)viewDidLoad
{
    [super viewDidLoad];


// get the current top place name and fetch photos at that place from flicker
if ([self.photosList isKindOfClass:[NSDictionary class]])
{
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.hidesWhenStopped = YES;
    spinner.center = self.tableView.center;//
    [self.view addSubview:spinner];
    [spinner startAnimating];

    dispatch_queue_t dispatchQueue1 = dispatch_queue_create("queue_top_50_photos", NULL);

    dispatch_async(dispatchQueue1, ^{


        self.photosList = [FlickrFetcher photosInPlace:self.photosList  maxResults:50];

        dispatch_async(dispatch_get_main_queue(), ^{

            if (self.tableView.window ){

                [self.tableView reloadData];
                [spinner stopAnimating];
            }
        });
    });

   dispatch_release(dispatchQueue1);
}

// Uncomment the following line to preserve selection between presentations.
self.clearsSelectionOnViewWillAppear = YES;

self.title = @"50PhotoList";

}

デバッガで条件([self.photosList isKindOfClass:[NSDictionary class]])を満たしていることを確認

4

2 に答える 2

3

viewDidAppear私はこれについて考えていましたが、代わりにこのコードを実行してみましたviewDidLoadか?やってみます。

操作ごとに新しいキューを作成する理由は何ですか?dispatch_release最後に命令を削除するとどうなりますか?非同期操作は、キューが解放されるまでの時間よりも時間がかかる場合があります。

自分で作成したキューではなく、グローバルキューを使用してみてください。完了したら、解放する必要はありません。

交換

dispatch_queue_t dispatchQueue1 = dispatch_queue_create("queue_top_50_photos", NULL);

dispatch_queue_t dispatchQueue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

を削除しますdispatch_release(dispatchQueue1);

于 2013-01-31T04:29:29.223 に答える
0

dispatch_async はすぐに戻り、バックグラウンドでタスクを実行し、残りのコードを viewDidLoad または他の viewDidAppear メソッドで実行します。

1つの解決策は、タスクの実行を待機するdispatch_syncを使用し、このようにdispatch_asyncにネストすることです

    dispatch_queue_t dispatchQueue1 = dispatch_queue_create("queue_top_50_photos", NULL);

dispatch_async(dispatchQueue1, ^{

      dispatch_queue_t dispatchSyncQueue = dispatch_queue_create("queue_top_50_photos", NULL);

       dispatch_sync( dispatchSyncQueue,^){
          self.photosList = [FlickrFetcher photosInPlace:self.photosList  maxResults:50];
       });
        dispatch_sync(dispatch_get_main_queue(), ^{

        if (self.tableView.window ){

            [self.tableView reloadData];
            [spinner stopAnimating];
        }
    });

    dispatch_release(dispatchSyncQueue);
});

   dispatch_release(dispatchQueue1);
于 2013-02-23T05:29:13.193 に答える