草庐IT

iphone - 将委托(delegate)从 ViewController 分离到自己的类

coder 2023-09-29 原文

我是 iOs 开发的新手,我有点困惑我应该如何分离我的代码以避免巨大的 ViewController.m 文件。目前我的主视图 Controller 有很多委托(delegate):

@interface ViewController : UIViewController <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate>

我想减少 viewController 代码,我想我应该创建单独的类来处理委托(delegate)任务。问题是,如果我为 CLLocationManager 创建单例类并让它实现委托(delegate)方法,那么我如何与 View Controller 通信?

假设我的 CLLocationManager 接收到位置更新,我如何告诉 viewController 更改 UI?我应该使用 NSNotificationCenter 发布通知,然后将观察者添加到 View Controller 吗?还是让 viewController 像现在一样实现所有委托(delegate)方法是最好的方法?

最佳答案

将其中一些功能移到您的数据模型中。

鉴于您提供的信息有限,很难说您应该如何管理它,但人们不得不怀疑单个 View Controller 是否真的应该管理 map View 跟踪位置 管理 HTTP 连接 管理核心数据获取。为什么不将其中一些移到您的模型中,这样划分模块会更容易一些?

Let's say that my CLLocationManager receives a location update, how do I tell the viewController to make changes to the UI? Should I use NSNotificationCenter to post a notification and then add observer to the view controller?

通知将是一个很好的解决方案——它为您的程序中管理位置的部分(同样,这可能属于模型)提供了一种方式来传达更改,而无需特别了解有关该部分的任何信息关心位置变化的程序。它还允许一对多通信——如果您有另一个也关心位置的 View Controller ,它可以观察到相同的通知。

Or is the best way just to let viewController implement all delegate methods as it is now?

我尽量考虑适本地划分职责,而不是限制代码的大小。如果您有一个只完成一项工作但需要大量代码才能完成的类,那很好。如果你有一个类来管理许多不相关的事情,那就不太好了。麻烦的是,很多工作似乎都属于传统的 View Controller “管理一屏内容”的角色。尝试将管理数据呈现的任务(这是 View Controller 的合法工作)与管理数据本身(这是模型的工作)分开。

关于iphone - 将委托(delegate)从 ViewController 分离到自己的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18617457/

有关iphone - 将委托(delegate)从 ViewController 分离到自己的类的更多相关文章

  1. ruby - 更改 ActiveRecord 中对象的类 - 2

    假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。

  2. 带有 attr_accessor 的类上的 Ruby instance_eval - 2

    我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到

  3. ruby - 是否可以从也在该模块中的类内部调用模块函数 - 2

    在这段Ruby代码中:ModuleMClassC当我尝试运行时出现“'M:Module'的未定义方法'helper'”错误c=M::C.new("world")c.work但直接从另一个类调用M::helper("world")工作正常。类不能调用在定义它们的同一模块中定义的模块函数吗?除了将类移出模块外,还有其他解决方法吗? 最佳答案 为了调用M::helper,你需要将它定义为defself.helper;结束为了进行比较,请查看以下修改后的代码段中的helper和helper2moduleMclassC

  4. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  5. ruby - TypeError(救援条款所需的类或模块) - 2

    我已经使用Stripe一年多了,基于RyanBates的RailsCast插曲发现here.但是,我的错误处理最近停止工作,而且我以前从未见过此错误。我最近开始在Ruby2.1上运行我的应用程序,据我所知,这就是问题所在。这是我的订阅模型中的一个实例方法:beginsave_with_stripe_paymentrescueStripe::InvalidRequestError=>elogger.error"Stripeerrorwhilecreatingcustomer:#{e.message}"logger.errore.backtrace.join("\n")errors.add

  6. ruby - 将属性方法委托(delegate)给父对象 - 2

    我有以下类(class):classAlphabetattr_reader:letter_freqs,:statistic_letterdefinitialize(lang)@lang=langcaselangwhen:en@alphabet=('A'..'Z').to_a@letter_freqs={...}when:ru@alphabet=('А'..'Я').to_a.insert(6,'Ё')@letter_freqs={...}...end@statistic_letter=@letter_freqs.max_by{|k,v|v}[0]endendfoo=Alphabet.n

  7. ruby - []如何在Ruby中的类上工作 - 2

    我看到我可以使用获取目录中的文件列表Dir["*"]我应该如何准确阅读该语法?据我所知,您可以使用[]从数组或散列中获取值。[]如何处理通话? 最佳答案 []只是一个方法,如#to_s、#object_id。等你可以在任何对象上定义它:classCoolClassdef[](v)puts"hello#{v}"endendCoolClass.new["John"]#=>"helloJohn"在你的情况下,它被定义为单例方法,以这种方式:classDirdefself.[](v)...endend

  8. ruby-on-rails - Rails 中的类实例变量应该在互斥体中设置吗? - 2

    假设我的Rails项目中有一个设置实例变量的Ruby类。classSomethingdefself.objects@objects||=begin#somelogicthatbuildsanarray,whichisultimatelystoredin@objectsendendend是否可以多次设置@objects?是否有可能在一个请求期间,在上面的begin/end之间执行代码时,可以在第二个请求期间调用此方法?我想这实际上归结为Rails服务器实例如何fork的问题。我应该改用Mutex还是线程同步?例如:classSomethingdefself.objectsreturn@o

  9. ruby - 回调模块中定义的类 - 2

    Ruby已经有几个built-incallbacks.这种情况有回调吗?有点像method_added,但用于模块内的类(或常量),而不是类内的实例方法。 最佳答案 据我所知,没有什么与您描述的完全一样。但是,您可以使用Class::inherited创建自己的类。moduleMyModuledefself.class_added(klass)#...handleitendclass::Classalias_method:old_inherited,:inheriteddefinherited(subclass)MyModule.c

  10. ruby - 我如何从 Rational(或任何没有构造函数的类)继承? - 2

    例如,我可以很容易地继承自String,如下所示:classMyString'thingsandstuff'但是我如何继承没有构造函数的Rational呢?例如:defMyRatNoMethodError:undefinedmethod`new'forMyRat:ClassMyRat(10).inc#=>NoMethodError:undefinedmethod`MyRat'formain:ObjectMyRat.send(:initialize,10).inc#=>TypeError:alreadyinitializedclass#???#Noneofitworks!我找不到初始化新

随机推荐