0

まず第一に、私の英語が下手で申し訳ありませんが、私はフランス人であり、理解できるように最善を尽くします.

だから、私はこの構造を持つ単純なアプリケーションをコーディングしています:

私がやろうとしているのは、viewController の ws_product で JSON を解析した後に取得した製品配列を返すことです。これにより、tableView を埋めることができ、アプリケーションが空ではなくなります。

私の実際の ws_product は次のとおりです。

#import "WS_Produit.h"
#import "Produit.h"
#import "ViewController.h"

@implementation WS_Produit

- (NSMutableArray *)getProduitsJSON
{
    __block NSMutableArray *result;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() {

        NSLog(@"on passe en async");

        NSError *error         = nil;
        NSData  *jsonData      = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"the url to load"]];
        NSDictionary *produits = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];


        if( error )
        {
            NSLog(@"%@", [error localizedDescription]);
        }
        else {
            dispatch_sync(dispatch_get_main_queue(), ^(){

                NSLog(@"retour en sync");
                result = [[NSMutableArray alloc] init];
                Produit *tmp;

                NSArray *produit = produits[@"produits"];
                for ( NSDictionary *property in produit )
                {
                    tmp             = [Produit new];
                    tmp.ref         = property[@"ref"];
                    tmp.name        = property[@"name"];
                    tmp.description = property[@"description"];
                    tmp.price       = property[@"price"];
                    tmp.imgURL      = property[@"imgURL"];

                    [result addObject:tmp];
                    NSLog(@"%@", result);
                }
            });
        }
    });
    NSLog(@"sortie du block");
    NSLog(@"%@", result);
    return result;
}

@end

私の問題は、私がdispatch_queueの外にいるときです。私の結果の配列は空なので、viewControllerクラスでそれを返すのは無意味です。

4

1 に答える 1

2

dispatch_async を使用しているため、結果配列はいっぱいになる前に空として返されます。

ブロックはまさに​​あなたが必要としているものです。これらは、非同期メソッドのコールバックとして使用できます。

viewController では、メソッドにブロックを渡す必要があります

[myObject getProduitsJSON:
                   success:^(NSArray *results){
                       // Use your results here
                       // Reload table for example.
                   }
                   failure:^(NSError *error){
                       // Use your error message (show it for example)
                   }];

したがって、メソッドは次のようになります。

-(void)getProduitsJson:(void(^)(NSArray* results))success failure:(void(^)(NSError* error))failure {
{
    NSMutableArray *result = [[NSMutableArray alloc] init];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() {
         NSError *error         = nil;
         NSData  *jsonData      = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"the url to load"]];
         NSDictionary *produits = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];

         if(error) {
             failure(error);
         }else{
             // Fill your array
             success(result);
         }
    }
}
于 2013-10-31T09:20:05.087 に答える