2016-06-17 8 views
1

これまでにこれが聞かれてきたと確信していますが、検索するキーワードがわかりません。メソッドが値を返すためにレスポンスを待つ方法を作る方法は?

は私がbool返す関数validateConnectionを持っていると仮定します。この関数は、(ネットワークを使用して)サーバーへの呼び出しを行い、要求が成功した場合はtrueを返します(これは単なる例です)。

私は応答がboolを返すために戻るまで私の方法が待機する:それを達成するためにどのように?

ご協力いただければ幸いです。

+3

用リンゴのドキュメントをお読みください。リクエストが完了したときにトリガする完全ハンドラを作成します。 –

+0

正確には、正しい答えを見ると、それはブロックを使用していたことがわかります。ありがとう! –

答えて

2

そのブロックとバックの呼び出しを作成するためのサンプル方法で使用することができます。

-(void)callmethodwith:(NSString*)string withCompletion:(void(^)(BOOL success, NSError* error, id responce))completion 
{ 

    NSString *str =[NSString stringWithFormat:@"MY FUNTn CALLBACK %@",string]; 
    if (completion){ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      completion(YES,nil,str); // here that call when method complete 
     }); 
    } 
} 

をとあなたは、次のようにそれを呼び出すことができます。

[self callmethodwith:@"My new" withCompletion:^(BOOL success, NSError *error, id responce) { 
     if(success) 
     { 
      NSLog(@"==%@",responce); // here you get response once method camplet 
     } 
    }]; 
+0

これは実際には正しい答えです。なぜ人々がUIをアップvしてしまったのか不思議。 – NSNoob

+0

そのupvoteは親愛なる人と近くの人から来たので:P –

+1

ありがとう!私が欲しかったものを正確に –

1

は、私は、メソッドが実行されると、それを止める方法がない、と思います。

ただし、解雇されていない場合はキャンセルできます。

次のようにします。

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(yourMethod) object:nil]; 
[self performSelector:@selector(yourMethod) withObject:nil afterDelay:5.0]; 
+1

これはいいですが、正しいとマークされた方が良いです。ありがとう! –

0

AFNetworkingの成功と失敗の方法を使用して応答を待つことができます。また、あなたはperformSelectorOnMainThread方法BlockIntroduction to Objective-C Blocks

によってブロックについての詳細を学ぶことができ呼び出さ

[yourViewController performSelectorOnMainThread:@selector(yourFunction:) withObject:nil 
waitUntilDone:YES]; 
+1

同期要求によってUIがフリーズされるため、推奨されません。 – Rajat

+1

待機は、応答インジケータを表示したり、応答が待たれるまでユーザーが他の作業のために画面にアクセスすることを許可することで実行できますが、フリーズUIはアプリがハングアップしていることをユーザーに誤解させ、 – Rajat

+0

ブロックは、そのタイプのタスクを行う正しい方法です。詳細は私の答えを確認してください –

-1

ブロックまたはCompletion Handlerを使用している間は、保持カウントに影響するため、クラスまたはビューの強い参照を使用していないことを確認してください。

ブロックまたは完了ハンドラでの作業中は、

__weak Class *weakSelf = self; 
[manager communicateUsingGETMethod:@"www.google.com" parameterDictionary:@{} success:^(id successDicitoanary) { 
    // Call using weak reference. 
[weakSelf handleSuccess]; 
} failure:^(NSError *error) { 
    [weakSelf handleFailure]; 
}]; 

ブロック、このような内部の弱い参照を使用すると、コードが読みやすくなります全体コードseparately.Thisを書いて、あなたは、としてあまりにサイクルを保持取り除くうあなたの参考のために、弱い参照して

をごcompletionCodeを呼び出している、あなたが完了ハンドラを使用することができますAvoid Strong Reference Cycles when Capturing self

+0

なぜ否定的? サイクルを保持するのを気にしないでください??? –

関連する問題