2016-04-12 1 views
1

サーバーから情報を取得する小さなiOsアプリケーションを開発していて、非常に便利なNSURLSessionDataTaskが見つかりました。 まず、私は私が私の方法で呼び出さ@property (nonatomic, strong) NSMutableArray *objectArray; を使用:メソッドブロック内のメソッド宣言から変数を使用するときに "変数が割り当てられない(__block型指定子がありません)"エラー

- (void) createObjectsArrayFromUrl: (NSString *) url { 
NSURL *URL = [NSURL URLWithString:url]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 
NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
             completionHandler: 
           ^(NSData *data, NSURLResponse *response, NSError *error) { 
            if(error) { 
             //error handling 
            } 
            dispatch_async(dispatch_get_main_queue(), ^{ 

            NSMutableDictionary *jsonDataDictionary = [objectModel getJsonData]; 

        self.objectArray = [objectModel arrayFromDictionary:jsonDataDictionary]; 

             [[self collectionView] reloadData]; 

            }); 
           }]; 
[task resume]; 
} 

そして、それはすべてがスムーズに行ってきました。 今、私は複数のアレイのために、普遍的な方法を作成したい、と私はこのように、メソッドに配列を渡すと、内部にそれを更新することでそれを行うには考えた:

- (void) createObjectsArrayFromUrl: (NSString *) url inArray: (NSMutableArray *) objectArray{ 
    NSURL *URL = [NSURL URLWithString:url]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
              completionHandler: 
            ^(NSData *data, NSURLResponse *response, NSError *error) { 
             if(error) { 
              //error handling 
             } 
             dispatch_async(dispatch_get_main_queue(), ^{ 

             NSMutableDictionary *jsonDataDictionary = [objectModel getJsonData]; 

         objectArray = [objectModel arrayFromDictionary:jsonDataDictionary]; 

              [[self collectionView] reloadData]; 

             }); 
            }]; 
    [task resume]; 
    } 

が、それは私にエラーを与えます次の行のタイトル: objectArray = [objectModel arrayFromDictionary:jsonDataDictionary];と私は進行する方法がわかりません。 私の考えは、私が以前持っていたすべての配列に対してメソッドを作成するのではなく、その配列を変数として渡してメソッド内で更新したいと考えているからです。 これを達成するには?おかげさまで

+0

にobjectArrayを代入するのではなく、[objectModel arrayFromDictionary:jsonDataDictionary];を試してください。 – SeanLintern88

+0

ありがとう、それは今動作します! 気をつけて少し説明しますか?私はObj-C世界の初心者です! – DarthGalm

+0

が答えとして追加されました:D – SeanLintern88

答えて

1

の代わりに

objectArray = [objectModel arrayFromDictionary:jsonDataDictionary]; 

は、入ってくるの変数は、このようにそれはブロックで使用できるようにすることの前に__blockを持っていないので、これは、これはローカル変数ではなくパラメータのためにのみ利用可能です

[objecyArray removeAllObjects]; 
[objectArray addObjectsFromArray:[objectModel arrayFromDictionary:jsonDataDictionary]]; 

を試してみてください。私は__blockがブロック内で参照されることを可能にするためにフードの下にあると信じています。

9

ブロック内の変数にアクセスする場合は、最初に__block NSArray *arr;のようにブロックとして割り当てる必要があります。完了ハンドラのブロック手段でその変数にアクセスできます。あなたのようなメソッド本体の開始時に1行を追加することができ、あなたのコードでは

__block NSArray *arr = objectArray; 

そして、のようなブロックで、このarrを使用し、これは:)

を助ける

arr = [objectModel arrayFromDictionary:jsonDataDictionary]; 

・ホープ

+1

信じられないほどです!魅力的な作品! –