4

我对此做了很多研究,但我对我的问题有一个心理障碍。我正在为 iOS 应用程序开发 Objective-C

这是我的设置:

  1. 视图控制器从视图(用户输入)中获取文本,并将该文本传递给模型的 MethodA。

  2. 模型中的 MethodA 作用于输入文本并获得输出(例如,在 google 中搜索该文本)。它使用 dispatch_async 方法进行搜索,该方法将选择器调用到模型中的 MethodB。

  3. MethodB 解析输出并将所有结果放入 NSMutableArray

  4. 我的问题在这里:如何将 NSMutableArray 传递回视图控制器,以便我可以在视图上显示它?

抱歉,如果我的问题的答案非常简单/明显。我是 Objective-C 的新手

4

5 回答 5

7

任何时候我想做异步处理并且这些东西需要回到 UI 的某个地方,我会做以下两件事之一:

1. Use NSNotification to tell anyone who cares that the work is complete
2. Use a delegate property on the worker and a @protocol

1 NS通知

模型对象应该在它的 .h 文件中记录当某些事情发生时它会触发通知;例如当模型的一部分被更新时。当 ViewController 初始化模型对象时,让它自己设置为记录通知的观察者,并实现一个更新 UI 的回调。

2 委托和@protocol

创建一个@protocol,例如@protocol FooModelUpdateDelegate使用正确命名为的方法fooObjectDidUpdate:(Foo *)object;,然后模型类有一个委托属性 asid<FooModelUpdateDelegate> updateDelegate并且 ViewController 将自己设置为该委托,我相信你可以弄清楚其余的。

于 2012-07-09T04:20:37.300 回答
3

我想传递一个响应选择器方法的委托对象并使用处理后的数据调用此方法将是实现程序应得的松散耦合结构的好方法。您是否熟悉这个概念,或者我应该为您挖掘一些代码示例?


更新:代码示例

所以,我可能会使用调用类,比如MyViewController,来实现 callbackMethod,myCallbackMethod如下所示:

-(void) myCallbakcMethod: NSMutableArray* array {
    //DoWhatever with the returned data
}

关键是在计算完成时将结果传递回此方法。因此,MyViewController在您调用的地方,MethodA您传递对委托的引用以处理结果 namly self

//From this:
[MyModel methodA:param1]
//To:
[MyModel methodA:param1:self]

MyModelsmethodA并且methodB需要添加一个参数(id)delegate并在调用之间传递它。

methodB数据myArray准备就绪的地方,执行以下调用:

    if([delegate respondsToSelector:@selector(myCallbackMethod:)]])
        [observer performSelector:@selector(myCallbackMethod:) withObject:myArray];
于 2012-07-09T04:00:41.087 回答
2

在您的视图控制器中:

    // your controller code
    ...
    [myModel getSearchResult:searchKeyword receiver:self action:@selector(responseReceived:)];
}

- (void)responseReceived:(MyModel *)model
{   
    NSArray *searchResult = model.searchResult; 
    [model release], model = nil;
    // some view actions, for instance update your table view
    ...
}

在您的模型中:

...
- (id)getSearchResult:(NSString *)searchKeyword receiver:(id)aReceiver action:(SEL)receiverAction {
    self.receiver = aReceiver;
    self.action = receiverAction;
    // some async actions
}

在异步响应接收器中:

    ...
    [self.receiver performSelector:self.action withObject:self];
}
于 2012-07-09T04:31:42.293 回答
1

除非我误解了您的描述,否则听起来您的“模型”课程做得比它应该做的更多。在这种情况下,它至少完成了控制器的一些工作。我的建议是将 methodA 和 methodB 折叠到视图控制器(或另一个控制器类)中。方法 B 仍然可以设置“模型”实例的 NSMutableArray 属性,如果这是必要的(或者如果不是,则跳过该步骤)。

于 2012-07-09T03:59:17.700 回答
0
-(void)methodA {
    NSMutableArray *someArray = ...
    [self methodB:someArray];
}

-(void)methodB:(NSMutableArray*)array {
    NSLog(@"%@", array);
    // do something with the array, like update the view
}

但是,如果两者都是视图控制器内部的方法,为什么不只是更新方法内部的视图而不是将其传递给另一个方法呢?

于 2012-07-09T04:10:20.683 回答