0

我是 IOS 的新手,当请求完成时,我正在构建一个带有来自服务器的响应的 http 请求。然而,我创建了一个新对象来处理请求......

据我所知,请求是异步处理的,这确保我的应用程序在处理请求时不会挂起

请记住,我在新对象中运行此请求

-(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 deligate 在我的其他类中运行时设置了该布尔值

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

    RegistrationSucceeded = TRUE ;
    //[self RegistrationSucceededMethod];

}

我的问题是如何在调用对象之前等待线程完成网络操作(即线程完成)

我的第二个问题是线程知道 connectionDidFinishLoading 作为它在对象中的一个 deligate 方法,它是否在该线程上运行

我的第三个问题是处理 http 请求响应的正常方式是什么,您的 ios 应用程序正在等待该响应以执行下一个任务

非常感谢解决这个问题的人!

4

3 回答 3

0
  1. like a completion block, but via dispatch. how to check an dispatch_async block has finished running

  2. not sure

  3. depends. One option is an activity wheel view with a timeout.

于 2013-06-18T18:34:01.677 回答
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 方法,如果该方法仍在执行,我只需在新线程上运行一个 timmer 以检查 5 秒

对于任何被线程卡住的人

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

于 2013-06-22T01:53:45.323 回答
0

我建议查看 [NSURLConnection sendAsynchronousRequest:queue:completionHandler]

它在完成请求时执行完成块。在完成处理程序内部,您可以访问已下载的数据,然后执行其他操作。

我建议尽可能多地使用积木,因为一旦你更好地控制它们,它们会让你的生活变得更加轻松。它们有助于避免使包装类包含委托回调方法,而且我认为也有助于代码可读性,因为您基本上是在说

[obj doThisFunction:^{
    andThenThisWhenYouFinish;
}];

积木上的 Apple 文档

我非常喜欢块,但我认为它们会帮助您处理您的 http 响应。

于 2013-06-18T20:08:46.447 回答