Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NSURLSession设计简单的ios应用程序_Ios_Objective C_Ios7.1_Nsurlsession - Fatal编程技术网

使用NSURLSession设计简单的ios应用程序

使用NSURLSession设计简单的ios应用程序,ios,objective-c,ios7.1,nsurlsession,Ios,Objective C,Ios7.1,Nsurlsession,我正在为iOS 7.1编写我的第一个应用程序objective-c。我可能从根本上不明白为什么会出现这个问题 应用程序非常简单:客户端使用web api与外部服务通信。要发送http请求,我使用NSURLSession。 我有一个简单的架构 TaleTestViewController-此视图控制器。这个类使用TaleAPI.h TaleAPI是web api的实现。我在一个单独的类中强调,每个外部API方法都在一个地方实现。下面是每个方法的查询的组成。此类使用TaleHttpHandler.h

我正在为iOS 7.1编写我的第一个应用程序objective-c。我可能从根本上不明白为什么会出现这个问题

应用程序非常简单:客户端使用web api与外部服务通信。要发送http请求,我使用NSURLSession。 我有一个简单的架构

TaleTestViewController-此视图控制器。这个类使用TaleAPI.h TaleAPI是web api的实现。我在一个单独的类中强调,每个外部API方法都在一个地方实现。下面是每个方法的查询的组成。此类使用TaleHttpHandler.h。 TaleHttpHandler—此类直接负责发送http请求和接收http响应

下面是TaleHttpHandler.m中发送POST查询的代码

-(void)sendpostTour:(NSURL*)带参数的url:(NSString*)输入参数比较:(void(^)(NSData*data))完成
{
NSLog(@“sendPostToURL”);
//\u csrftoken cookie中的令牌
NSMutableDictionary*cookieProperties=[NSMutableDictionary];
[cookieProperties setObject:@“csrftoken”forKey:NSHTTPCookieName];
[cookieProperties setObject:_csrftokenforkey:nshttpcookeValue];
[cookieProperties设置对象:[[NSDate date]dateByAddingTimeInterval:2629743]forKey:NSHTTPCookieExpires];
nshttpookie*cookie=[nshttpookie cookie WithProperties:cookieProperties];
[\u httpCookies存储集cookie:cookie];
[_sessionConfigsetHttpCookies存储:_HttpCookies存储];
//试过了
////NSURLSession*defaultSession=[NSURLSession sessionWithConfiguration:defaultConfigObject委托:nil//delegateQueue:[NSOperationQueue mainQueue]];
NSURLSession*defaultSession=[NSURLSession sessionWithConfiguration:_sessionConfig];
NSMutableURLRequest*urlRequest=[NSMutableUrlRequestWithURL:url];
//\u csrftoken参数中的令牌
NSString*params=[@[inParams,[u csrftoken]组件通过字符串连接:@'];
[urlRequestSetHttpMethod:@“POST”];
[urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding];
NSURLSessionDataTask*dataTask=[DefaultSessionDataTaskWithRequest:urlRequest
completionHandler:^(NSData*数据,NSURLResponse*响应,NSError*错误){
NSLog(@“获取响应%@时出现错误%@.\n”,响应,错误);
如果(错误==nil)
{
NSString*text=[[NSString alloc]initWithData:数据编码:NSUTF8StringEncoding];
NSLog(@“数据=%@”,文本);
}
完成(数据);
}];
[数据任务恢复];
}
所以,块完成不是在主线程中异步运行的,所以当发送请求并有接收和处理响应时,主线程运行。原则上,这是明确和合乎逻辑的,但我想“登录”使用这种方法,分别通过点击“登录”我要去后,成功的请求和响应,并处理用户应该看到的答案。iOS有哪些功能可以实现对等待异步块完成的主线程的这种行为,并显示相应的信息?或者也许它不值得等待,只是需要通知

当然,除非不创建单独的类,并且在viewController中执行所有操作,那么,假设会出现委托,但我想在其应用程序中实现一点模块化

也许我设计的系统是错误的,那么你可以解释或展示一个通常是如何实现的例子吗


我觉得这个要求很平庸,答案就在附近,请解释一下,提前谢谢

首先,您可以使用
dispatch\u sync
在主线程上执行块。但这并不是真正的问题。您试图在一个代码块中执行太多操作

您的流程需要如下所示:

  • 您是否记录了用户名/密码
  • 如果没有,就要一个
  • 运行您的网络请求
  • 错误处理包括查找无效凭据,在这种情况下,请求将被取消,代码将跳转到步骤2
    您可以为API调用使用。详细说明如何正确使用。您还可以使用在呼叫成功/失败时通知视图控制器

    抱歉。翻译了代码中的注释。为什么你认为我想在一个块中做太多?我只想接受响应,并在TaleAPI中进一步给出它。我尝试使用“代码”调度同步“代码”,但程序没有等待块执行。我的问题实际上是如何实现您在列表中所描述的内容。@njc代码下面的一段文字建议您在网络请求期间要求用户登录,也就是说,网络请求应该等到从用户处获得信息后再继续。这不是它需要的工作方式。您需要获取凭据,然后执行请求。可能是我解释错了。已具有凭据,用户将输入凭据。现在我想等待一个答案,并根据答案向用户界面显示信息。所以问题只是完成块没有在主线程上运行?我的问题是我不知道如何告诉我处理响应的界面,但我在上面提出了建议。我将使用或授权或通知。对吗?我考虑过通知和删除