0

要求が完了したときにサーバーからの応答を使用して http 要求を作成する IOS Im は初めてです。ただし、リクエストを処理するために新しいオブジェクトを作成しました...

私が見ることができる限り、リクエストは非同期的に処理され、リクエストが処理されているときにアプリがハングしないようにします

このリクエストを新しいオブジェクトで実行することに注意してください

-(void)signup
{

NSLog(@"Signeduop");
//placing all the form fields in an array
NSArray *fieldsArray;
NSArray *keysArryay;
keysArryay = [NSArray arrayWithObjects:
              [NSString stringWithFormat:@"e_mail"],
              [NSString stringWithFormat:@"MobileNo"],
              [NSString stringWithFormat:@"DeviceType"],
              [NSString stringWithFormat:@"AppleKey"],
              [NSString stringWithFormat:@"FamilyKey"],
              [NSString stringWithFormat:@"ServiceCompany"],
              [NSString stringWithFormat:@"First_Name"],
              [NSString stringWithFormat:@"Last_Name"],
              [NSString stringWithFormat:@"ID"],
              nil];

fieldsArray = [NSArray arrayWithObjects:

               [NSString stringWithFormat:@"%@",txt_email.text],
               [NSString stringWithFormat:@"%@",txt_telNo.text],
               [NSString stringWithFormat:@"APPLE"],
               [NSString stringWithFormat:@"PlaceheldforKey"],
               [NSString stringWithFormat:@"%@",txt_familyKey.text],
               [NSString stringWithFormat:@"%@",txt_serviceKey.text],
               [NSString stringWithFormat:@"%@",txt_firstname.text],
               [NSString stringWithFormat:@"%@",txt_lastname.text],
               [NSString stringWithFormat:@"%@",txt_id.text]
               ,nil];



NSDictionary *ValKeyDic = [NSDictionary dictionaryWithObjects:fieldsArray      forKeys:keysArryay];
NSError *error1 = [NSError alloc];

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ValKeyDic options:NSJSONWritingPrettyPrinted error:&error1];
NSString *jstring = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];

NSLog(@" ===== %@", jstring);



HttpClass * hy = [HttpClass alloc];

NSInteger varx = 45;

[hy setMode:(int *)55];
//[hy AppWayRegistration:(NSInteger *)varx : jstring] ;

dispatch_queue_t Queue = dispatch_queue_create("com.plump___________", 0);
//dispatch_queue_t high =     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
//dispatch_set_target_queue(Queue);
dispatch_sync(Queue, ^{ [hy AppWayRegistration:(NSInteger *)varx : jstring]; });
//dispatch_d  Queue);

    int d =hy.RegistrationSucceededMethod;
    NSLog(@"%d joooono",d);

[hy RegistrationSucceededMethod];
//NSLog(@"J -- %d",[hy RegistrationSucceededMethod]);



}

コードが実行された後、ブール値をサブクラス [hy RegistrationSucceededMethod] に設定することになっています。

そのブール値は、NSURLConnections デリゲートが他のクラスで実行されたときに設定されます

-(void)connectionDidFinishLoading: (NSURLConnection *) connection
{
 //do something with the data
    NSLog(@"Suckceeded! recieved %d bytes of data",[recieveData length]);

    RegistrationSucceeded = TRUE ;
    //[self RegistrationSucceededMethod];

}

私の質問は、オブジェクトを呼び出す前に、スレッドがネットワーク操作を完了するのをどのように待つかです (つまり、スレッドが終了します)。

私の2番目の質問は、connectionDidFinishLoadingをオブジェクトのデリゲートメソッドとして認識し、そのスレッドで実行するスレッドです

私の 3 番目の質問は、ios アプリが次のタスクを実行するためにその応答を待っている http 要求応答を処理する通常の方法です。

これを解決してくれた人に感謝します!!

4

3 に答える 3

0

[NSURLConnection sendAsynchronousRequest:queue:completionHandler] を確認することをお勧めします

リクエストを終了すると、完了ブロックが実行されます。完了ハンドラー内で、ダウンロードされたデータにアクセスして、他の操作を実行できます。

できる限りブロックを使用することをお勧めします。ブロックをより適切に制御できるようになると、生活がずっと楽になるからです。それらは、ラッパークラスにデリゲートコールバックメソッドを含めることを回避するのに役立ちます。また、基本的に言っているので、コードの読みやすさにも貢献していると思います

[obj doThisFunction:^{
    andThenThisWhenYouFinish;
}];

ブロックに関する Apple ドキュメント

私はブロックが大好きですが、http 応答を処理するのに役立つと思います。

于 2013-06-18T20:08:46.447 に答える
0

最後に答えが見つかりました...私はDispatch_asyncを放棄し、NSthreadを使用しました...ここで私を助け、apples dev docsからの引用

OS X v10.5 以降で NSThread オブジェクトを初期化する簡単な方法は、initWithTarget:selector:object: メソッドを使用することです。このメソッドは、detachNewThreadSelector:toTarget:withObject: メソッドとまったく同じ情報を取得し、それを使用して新しい NSThread インスタンスを初期化します。ただし、スレッドは開始されません。スレッドを開始するには、次の例に示すように、スレッド オブジェクトの start メソッドを明示的に呼び出します。

NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                    selector:@selector(myThreadMainMethod:)
                                    object:nil];
[myThread start];  // Actually create the thread

-isFinished -isExecuting のスレッド メソッドを使用することで、bool メソッドを呼び出すタイミングを確認できます。メソッドがまだ実行中の場合は、新しいスレッドでタイマーを実行して 5 秒でチェックします。

スレッド化に行き詰まっている人向け

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html

于 2013-06-22T01:53:45.323 に答える