如何等待在迅速
我要创建简单对象帮手对我的雨燕2.0的应用程序发送许多地方的短信UI代理,并在接下来的步骤中的另一助手(电子邮件,PDF开瓶器等)如何等待在迅速
我创建简单类:
import Foundation
import MessageUI
class SmsHelper: MFMessageComposeViewControllerDelegate {
func sendSMS(body: String){
if (MFMessageComposeViewController.canSendText()){
let messageVC = MFMessageComposeViewController()
messageVC.body = body
//messageVC.recipients = ["Enter tel-nr"]
messageVC.messageComposeDelegate = self;
AppDelegate().sharedInstance().getTopController().presentViewController(messageVC, animated: false, completion: nil)
}
else{
//do some alert etc.
}
}
func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult){
sendSMSRsp(result, errorMsg: nil)
controller.dismissViewControllerAnimated(true, completion: nil)
print("sms didFinishWithResult")
}
}
在代码的任何地方
我想这样做:
class someAnotherClass{
func someFunction(){
let smsHelper = SmsHelper()
smsHelper.sendSms("some text")
}
}
所以短信IOS编辑器中打开,但是当我想关闭或发送,这不排除,功能messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult)
我从来没有调用和应用程序崩溃的内存泄漏,我知道的原因:是因为'someFunction'中的SmsHelper对象正在删除此函数的结束范围后,此对象为零,并且系统尝试调用didFinishWithResult在零对象。我确认它:当我添加smsHelper对象作为'SomeClass'的成员时它工作 - 调用委托。
问题是:做这件事的最佳做法是什么,添加一个成员对我来说不是一种选择,因为许多类可以使用它,也创建一个单例,appDelegate成员是我认为很愚蠢的。如何强制不删除作用域结束时的对象?
尝试使用单的方式来做到这一点:
class SmsHelper: MFMessageComposeViewControllerDelegate {
static let sharedInstance = SmsHelper()
private init() {}
}
与用法:
SmsHelper.sharedInstance().sendSms('some text')
编辑: 如果从抽象类中添加不同的init方法。
private override init(message: String){
super.init()
}
然后改变定义为static let sharedInstance = SmsHelper(message:"smsHelper")
将不复杂。
为了您的委托,只是为它分配了init
方法,在UIViewController
viewDidLoad
,
SmsHelper.sharedInstance().delegate = self
对我来说,这样做的方法是创建一个封闭的类型ALIS,然后存储的这种类型别名的可选变量。当你调用sendSMS时,你传入一个闭包并将其设置为你的变量。然后,可以在委托调用,然后将其穿过sendSMS关闭:
import Foundation
import MessageUI
class SmsHelper: MFMessageComposeViewControllerDelegate {
let messageVC: MFMessageComposeViewController!
typealias SMSCompletion = (result: MessageComposeResult, errorMsg: NSError?) ->()
var sendSMSRsp: SMSCompletion?
func sendSMS(body: String, completion: SMSCompletion){
sendSMSRsp = completion
if (MFMessageComposeViewController.canSendText()){
messageVC = MFMessageComposeViewController()
messageVC.body = body
//messageVC.recipients = ["Enter tel-nr"]
messageVC.messageComposeDelegate = self;
AppDelegate().sharedInstance().getTopController().presentViewController(messageVC, animated: false, completion: nil)
} else {
//do some alert etc.
}
}
func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult){
sendSMSRsp?(result: result, errorMsg: nil)
controller.dismissViewControllerAnimated(true, completion: nil)
print("sms didFinishWithResult")
}
}
class SomeOtherClass {
func someFunction() {
let smsHelper = SmsHelper()
smsHelper.sendSMS("some text") { (result, errorMsg) ->() in
}
}
}
它的工作,但可能有点复杂,如果SmsHelper具有自定义构造函数父母,为前,当我有3类: SmsHelper,PdfHelper,EmailHelper和具有构造函数Helper(body:String)的抽象类Helper,我开始阅读关于NSOperation的信息,可以使用NSOperation来解决这个问题吗? – luky0007
抱歉,我迷失了你所说的,但为什么你需要抽象类?如果添加一些方法可以获得耦合。为什么不?所有的助手应该是NSObject的子类。从我的角度来看。如果这个答案有帮助,请接受它。 –
我看到他描述'也创建一个单身人士,我认为appDelegate成员很愚蠢。 ' –