1
-(NSDictionary *)fetchFromUrl:(NSString *)url{
    NSURLRequest *request = [NSURLRequest  requestWithURL:[NSURL URLWithString:url]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                        completionHandler:
                              ^(NSData *data, NSURLResponse *response, NSError *error) {
                                  dataFetched = [NSJSONSerialization JSONObjectWithData:data
                                                                                           options:0
                                                                                             error:NULL];

                              }];
    [task resume];
    NSLog(@"dataFetched, %@", dataFetched);

    return dataFetched;
}

そのため、dataFetched をグローバル変数として配置しようとしたので、.m ファイルの周りにアクセスして他の .m ファイルにアクセスできるようにしましたがNSLog、他の .m ファイルから dataFetched を実行しようとすると、( null ) が出力されます。とにかく、データを必要とする他の .m ファイル全体でデータにアクセスできるようにすることはできますか?

4

2 に答える 2

1

を返す代わりに、メソッドで block を使用する必要がありNSDictionaryます。コードを次のように変更します。

最初にこのようにメソッドを変更します

-(void)fetchFromUrl:(NSString *)url withDictionary:(void (^)(NSDictionary* data))dictionary{ 
    NSURLRequest *request = [NSURLRequest  requestWithURL:[NSURL URLWithString:url]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                            completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      NSDictionary *dicData = [NSJSONSerialization JSONObjectWithData:data
                                                                                    options:0
                                                                                      error:NULL];
                                      dictionary(dicData);
                                  }];
    [task resume];          
}

このようにメソッドを呼び出します

[self fetchFromUrl:urlStr withDictionary:^(NSDictionary *data) {
    self.dataFetched = data;
    NSLog(@"data %@",data);
}];
于 2016-08-01T05:09:42.480 に答える
0

ブロック内を変更する場合は、以下のようにプロパティの属性をNSDictionary宣言する必要があります__block

@property (nonatomic, strong) __block NSDictionary *dataFetched;

ドキュメントを見てください

__block 変数を使用してストレージを共有する キャプチャされた変数の値をブロック内から変更できるようにする必要がある場合は、元の変数宣言で __block ストレージ タイプ修飾子を使用できます。これは、元の変数の字句スコープとそのスコープ内で宣言されたブロックの間で共有されるストレージに変数が存在することを意味します。

于 2016-08-01T04:58:27.673 に答える