首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS - API对象与控制器之间的通信

iOS - API对象与控制器之间的通信
EN

Stack Overflow用户
提问于 2014-05-22 08:03:32
回答 1查看 406关注 0票数 2

我对两件事很好奇:

1如何设计与API和视图控制器通信的对象之间的有效且易于扩展的通信方式?

2如何设计通信对象本身(如何设计可伸缩的方法,.)

(我下面提到的方法是混乱的,我知道,但截止日期是疯狂的,直到现在我还没有时间去真正考虑它。)

让我介绍一下我正在处理的任务:

我必须编写2-3个应用程序,这取决于与API的通信。API响应的方法大约有10-15个(通过http POST发送,结果是JSON)。当然,通信必须是异步的。

我的方法:

因此,所有的apiComm都共享了与API (简称UIViewControllers )通信的对象。apiComm有10-15个方法,每个方法都适用于API能够处理的方法;各个请求内容之间存在很大的差异。=> 问题2

当apiComm收到来自API的数据时,它会在NSNotificationCenter defaultCenter上发布通知。这意味着,每个想要使用UIViewController的apiComm都必须为通知注册self,并实现处理传入通知的方法。由于一些UIViewController不得不处理更多的API请求,. => 问题1,这种方法变得很讨厌

我想知道在设计这些问题时是否有一种通用的模式。我很乐意就这个问题的任何部分发表意见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-22 09:21:14

对我来说,对于这个棘手的问题,我能给出的唯一真正的答案或方向是:

  • 无论如何,使用某种抽象类-like模式,就像@liamnichols指出的那样。
  • 如果您正在阅读iOS的新内容,绝对必须使用“后缀.”块模式(下面代码中的示例)
  • 在这一点上,以下是iOS/objective https://stackoverflow.com/a/20760583/294884中的一个绝对临界点。如何使块成为属性
  • 纯粹的国际海事组织,我从来没有发现一个大项目,其中的“15个项目”,实际上,真正合理的。只是还没有发生。所以对我们来说最好的方法是小心地--至少--把它包装起来,这样或那样的话,你就把"15件物品“叫做这样的东西。CLOUD.NOTES ..CLOUD.PROFILE ..CLOUD.SCORES ..等等,从你的其余代码。
  • 当然,在网络系统中使用单例。
  • 在网络系统中同时使用KVO和NSNotifications是非常关键的。
  • 值得注意的是,在iOS世界中处理JSON非常容易,这些天,(幸运的是)拥有“仅15个单独的文件”{这么或那样的}确实不是一件坏事,而且可以很容易地将它看作是你所能做的最明确的合理化。

所以,只是一些复杂的想法。最后一点--所有的事情都是转移到parse.com,所以这一切都变得毫无意义,幸运的是:)

这几乎是一个“我正在与一个尚未搬到bAAs的客户一起工作”(‘不,真的!’),所以我如何保持网络代码整洁.!哈哈。

再简单不过了,只是编写了一个不错的单例

把它放到任何需要它的应用程序中。

现在在iOS中处理JSON非常容易。所以,我所描述的往往是微不足道的。不过几十行代码而已。

你的“云”文件将包含这样简单的例程..。这个单身人士会被称为“空白”或类似的..。它从服务器获得一些“空白”用户文件类型,比方说。

代码语言:javascript
运行
复制
-(void)loadIfNeededThen:(void(^)(void))after
    {
    if ( self.rawStubsFromCloud != nil )
        {
        NSLog(@"good new, blanks are already loaded!!");
        after();
        return;
        }

    [APP huddie]; // (use MBProgressHUD for all spinners)
    APP.hud.labelText = @"Loading file blanks from cloud...";

    dispatch_after_secs_on_main(0.1 ,
            ^{
            [self _refreshThen:
                ^{
                [APP.hud hide:YES];

                NSLog(@"loaded the blanks fine:\n%@\n",
                    [self supplyDisplayStyleString] );

                after();
                }];
            }
        );
    }
-(void)_refresh
    {
    [self _refreshThen:nil];
    }

#define uBlanks [NSURL URLWithString:@"http://blah.com/json/blanks"]
-(void)_refreshThen:(void(^)(void))after
    {
    dispatch_async(dispatch_get_main_queue(),
        ^{
        self.rawBlanksFromCloud = [NSData dataWithContentsOfURL:uBlanks];

        [self _doShowAllOnLog];

        after();
        });
    }

值得注意的是,正在向Parse.com和其他bAAs转移。没有其他现实的未来,在今年年底之后不会有太多的“服务器端”。

因此,在实践中,这些简单的单例变得更加简单--它们只是连接到Parse的少数代码行。享受吧!

所以TBC上面的代码示例来自于"ye服务器“的情况。

这里有一个获取“用户文件”的示例。(请注意用于组装该死的url调用的方便的例程postStringUser。我从来没有找到过一种很好的方法来做到这一点!)

代码语言:javascript
运行
复制
-(NSString *)postStringUser:(NSString *)user pass:(NSString *)pass
{
NSString *username = user;
NSString *password = pass;

NSMutableString *r = [NSMutableString stringWithString:@""];

[r appendString:@"command=commandExampleGetFile"];
[r appendString:@"&"];

[r appendString:@"name=blah"];
[r appendString:@"&"];

[r appendString:@"user="];
[r appendString: [username stringByUrlEncoding] ];
[r appendString:@"&"];

[r appendString:@"password="];
[r appendString: [password stringByUrlEncoding] ];

return r;
}

#define yourUrl [NSURL URLWithString:@"http://blah.com/json/blah"]

-(void)fetchTheUsersFiles:(NSString *)user pass:(NSString *)pass then:(void(^)(void))after
{
NSString *postString = [self postStringUser:user pass:pass];
NSLog(@"postString is %@ ", postString );

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:yourUrl];
request.HTTPMethod = @"POST";
request.HTTPBody = [ postString dataUsingEncoding:NSUTF8StringEncoding];
[request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField: @"Content-Type"];

[APP huddie]; // use MBProgress everywhere and always at all times in all apps always
APP.hud.labelText = @"Connecting to the cloud...";

// 1 get the data
// 2 make it a jdic
// 3 make it an array of the "files"

[NSURLConnection
  sendAsynchronousRequest: request
  queue: [NSOperationQueue mainQueue]
  completionHandler:^(NSURLResponse *r, NSData *data, NSError *error)
    {
    [APP.hud hide:YES];
    NSLog(@"Done... %@", r);

    self.rawGetFilesFromCloud = data;

    NSError* err;
    NSDictionary* jdic = [NSJSONSerialization
      JSONObjectWithData:self.rawGetFilesFromCloud
      options:kNilOptions
      error:&err];

      //dev only
      NSLog(@"Here's the whole damned jdic, for GetFiles\n%@", jdic);

    if ( ! jdic )
      {
      [APP simpleOK:@"Wrong username or pass? Or no files found."];
      }
    else
      {
      // the user has "logged in" so something like
      STATE.currentUsername = user;
      STATE.currentPassword = pass;
      // naturally you have a STATE singleton, every app needs one

      self.rawArrayFromCloud = [jdic objectForKey:@"data"];

      NSInteger kUserFiles = self.rawArrayFromCloud.count;
      NSString *sayString = [NSString stringWithFormat:
        @"We found %lu files of yours on the damned cloud.", kUserFiles];

      /*
      and for example...
      STATE.fileZero = self.rawArrayFromCloud[0];
      or for example...
      NSDictionary *oneStubDict = self.rawArrayFromCloud[17];
      NSString *subjectName = oneStubDict[@"subjectName"];
      NSString *mainBody = oneStubDict[@"mainBody"];
      NSString *authorField = oneStubDict[@"authorField"];
      */

      [APP simpleOK: sayString
          then:^{ [STATE showFileInterface]; } ];
      }

    if (after) after();
    }];

}

注意,关键代码只不过是.

代码语言:javascript
运行
复制
NSMutableURLRequest *request = ...

[NSURLConnection sendAsynchronousRequest: request ...

NSDictionary* jdic = [NSJSONSerialization JSONObjectWithData:result ...

NSArray *theFiles = [jdic objectForKey:@"theFiles"];

NSString *aField = theFiles[13]["coverInfo"]["aField"];

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23801085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档