2016-08-01 4 views
0
からNSDictionaryのを取得する方法
-(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ファイルからのアクセスを可能にできますが、可能性がしようとした私はdataFetched NSLogしようとしたとき、それ以外の.mファイルからは(null)が出力されます。とにかくデータを必要とする他の.mファイルでデータにアクセスできるようにすることはできますか?NSURLSessionDataTask

答えて

1

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); 
}]; 
+0

それは働いた!しかし、これは(void(^)(NSDictionary * data))辞書はどのように動作するのですか? – jane

+0

あなたはAPIコールを作成していて、それはバックグラウンド(非同期)で動作します。返り値NSDictionaryで宣言した関数は同期の仕方で動作します。その前に応答を得ると、ブロックは非同期で動作します。 –

+0

大丈夫ですが、それは機能しましたが、どのようにデータ値にアクセスするのですか?私は__blockを使ってみましたが、まだ値を取得していません。 – jane

0

あなたができるようにする必要がある場合は共有ストレージへdoc

使用__block変数で

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

下記をご覧のようにあなたの財産のための __block属性を宣言する必要ブロック内でご NSDictionaryを変更した場合〜 キャプチャされた変数の値をブロック内から変更すると、 元の変数に__blockストレージタイプ修飾子を使用できます decl aration。これは、変数が元の変数のレキシカルスコープとそのスコープ内で宣言された ブロックとの間で共有される であることを意味します。

+0

大丈夫のようなあなたのメソッドを呼び出して、なぜ私は__blockを追加する必要がありますか? – jane

+0

私は__blockを追加して申し訳ありませんが、まだヌルです... – jane

関連する問題