2016-08-27 6 views
-1

私は定期的にSwiftの委任を使用し、それをいくつかのプロジェクトで正常に実装しました。私は現在、私が理解していない問題を抱えています。 CreateMessageBEDelegateデリゲートがコールバックメソッドを起動した後、CreateMessageBEオブジェクトはMessageViewControllerのnilになります。コールバックの前にCreateMessageBEでメッセージオブジェクトをテストすると、それがnilではないことがわかります。即時委任の問題

以下の情報は、コードの説明です。なぜこれがうまくいかないのか?

更新済み 特定の問題 - createMessageBEはnilです。以下を参照してください。ここで

class MessageViewController : UIViewController, FindMessageSenderDelegate, FindMessageReceiverDelegate, CreateMessageBEDelegate, UpdateBackendlessDelegate 
{ 
    // Backendless Property 
    let backendless = Backendless.sharedInstance() 

    // Message Properties 
    var messageSender : BackendlessUser? 
    var MessageReceiver : BackendlessUser? 
    var messageText : String? 
    var message : MessageBE? 

    var findMessageSender : FindMessageSender? 
    var findMessageReceiver : FindMessageReceiver? 
    var createMessageBE : CreateMessageBE? 
    var updateBackendless : UpdateBackendless? 

func findMessageReceiverDidFindUsernameMessageReceiver(findMessageReceiverInput : FindMessageReceiver) 
    { 
     // Set the Message User Message Receiver 
     self.messageReceiver = self.findMessageReceiver!.messageReceiver 

     self.createMessageBE = CreateMessageBE(guestMessageUserInput: self.guestMessageUser!, messageReceiverInput: self.messageReceiver!, messageInput: self.message!, delegateInput: self) 
     //print(self.createMessageBE) If I call this here self.createMessage is not nil in the delegate call back. If I do not call it, it is nil. 
    } 

func createMessageBEWithMessageSenderAndMessageReceiverDidSuceed(createMessageBEInput: CreateMessageBE) 
    { 
     // Set the MessageBE Property 
     self.message = self.createMessageBE?.message 

     // Update Backendless 
     self.updateBackendless = UpdateBackendless(messageBEWithMessageSenderAndMessageReceiver: self.message!, delegateInput: self) 
    } 

MessageViewController

func createMessageBEWithMessageSenderAndMessageReceiverDidSuceed(createMessageBEInput: CreateMessageBE) 
    { 
     self.message = self.createMessageBE?.message // createMessageBE is nil 

     // Update Backendless 
     self.updateBackendless = UpdateBackendless(messageBEWithMessageSenderAndMessageReceiver: self.message!, delegateInput: self) 
    } 

はここCreateMessageBEクラス

import Foundation 
import CoreData 

protocol CreateMessageBEDelegate 
{ 
    func createMessageBEWithMessageSenderAndMessageReceiverDidSuceed(createMessageBEInput : CreateMessageBE) ->() 
} 

class CreateMessageBE : NSObject 
{ 
    // Properties 
    var message : MessageBE? 

    // Backendless Property 
    let backendless = Backendless.sharedInstance() 

    // Delegate Property 
    var delegate : CreateMessageBEDelegate? 

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

    // Custom Init Method 
    init(messageSenderInput: BackendlessUser, messageReceiverInput: BackendlessUser, messageTextInput: String, delegateInput: CreateMessageBEDelegate) 
    { 
     super.init() 

     // Create MessageBE for Message User Sender and Message User Receiver 
     self.message = MessageBE(messageSenderInput: messageSenderInput, messageReceiverInput: messageReceiverInput, messageTextInput: messageTextInput) 
     self.delegate = delegateInput 

     self.returnMessageBEWithMessageSenderAndMessageReceiver() 
    } 
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

    func returnMessageBEWithMessageSenderAndMessageReceiver() 
    { 
     // Return the created MessageBE to MessageViewController 
     if self.message != nil 
     { 
      print("In the createMessageBEDelegate and printing self.message \(self.message)") 
      self.delegate?.createMessageBEWithMessageSenderAndMessageReceiverDidSuceed(self) 
     } 
     else 
     { 
      // Report error. 
     } 
    } 
} 

である私は私のコードで問題を考え出し

import Foundation 
import UIKit 

class MessageBE: NSObject 
{ 
    // This is a custom class used to access Message Objects that are stored Backendless. 
    var objectId : String? 
    var created : NSDate? 
    var updated : NSDate? 
    var messageSender : BackendlessUser? 
    var messageReceiver : BackendlessUser? 
    var messageText : String? 
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

    init(messageSenderInput: BackendlessUser, messageReceiverInput: BackendlessUser, messageTextInput: Double) 
    { 
     self.messageSender = messageSenderInput 
     self.messageReceiver = messageReceiverInput 
     self.messageText = messageTextInput 
    } 
} 
+0

あなたのoptionalsをアンラップ、無理に押し込まないでください、あなたはこのような問題を持っていません。 –

+0

これはたくさんのコードです。私はその質問が何であるか、それがどのようにそのコードに関連しているか把握できません。問題が何であるか、どこで発生するのかを明確かつ正確に示す数行に減らすことができますか? – matt

+0

私は、上にcreateMessageBEがnilであることを示すコードブロックを追加しました。 – jonthornham

答えて

0

MessageBEクラスです。問題は、self.createMessageBEのインスタンス化が完了する前に、デリゲートコールバックでself.createMessageBEにアクセスしようとしていたことです。私の方法の順序と配置は間違っていました。以下では、初期コードと新しい更新コードを示します。

returnMessageBewithMessageSenderAndMessageReceiver()コールの配置が違いをもたらすことがわかります。この呼び出しを正しい場所に置くと、self.createMessageBEはインスタンス化されているので、nilではありません。私はこれが他の誰かを助けることを望む。オリジナルコード

MessageViewControllerクラス

オリジナルコード

func findMessageReceiverDidFindUsernameMessageReceiver(findMessageReceiverInput : FindMessageReceiver) 
     { 
      // Set the Message User Message Receiver 
      self.messageReceiver = self.findMessageReceiver!.messageReceiver 

      // Create createMessageBE 
      self.createMessageBE = CreateMessageBE(guestMessageUserInput: self.guestMessageUser!, messageReceiverInput: self.messageReceiver!, messageInput: self.message!, delegateInput: self)  
     } 

新しいコード

func findMessageReceiverDidFindUsernameMessageReceiver(findMessageReceiverInput : FindMessageReceiver) 
    { 
     // Set the Message User Message Receiver 
     self.messageReceiver = self.findMessageReceiver!.messageReceiver 

     self.createMessageBE = CreateMessageBE(guestMessageUserInput: self.guestMessageUser!, messageReceiverInput: self.messageReceiver!, messageInput: self.message!, delegateInput: self) 
     self.createMessageBE?.returnMessageBEWithMessageSenderAndMessageReceiver() 
    } 

CreateMessageBEクラス

新しいコード

// Custom Init Method 
    init(messageSenderInput: BackendlessUser, messageReceiverInput: BackendlessUser, messageTextInput: String, delegateInput: CreateMessageBEDelegate) 
    { 
     super.init() 

     // Create MessageBE for Message User Sender and Message User Receiver 
     self.message = MessageBE(messageSenderInput: messageSenderInput, messageReceiverInput: messageReceiverInput, messageTextInput: messageTextInput) 
     self.delegate = delegateInput 
    }