Как создать несколько экземпляров блока в Swift? - PullRequest
0 голосов
/ 07 июня 2018

Я определил блок, который возвращается после webservice вызова.

typealias Receive  = ([AnyHashable : Any]) -> Void

func method(_ paramter: paramter, block:@escaping Register){
   //some code
}

И я вызвал этот метод из appDelegate.swift.

handler.shared.method(_ paramter) { (isGranted, token, error) in
   //some code
}

Это работает, как и ожидалось.

Теперь Если я вызываю тот же метод из viewcontroller.swift Блок получает только в viewcontroller после получения ответа.

Я хочу создать несколько экземпляров одного и того же блока, чтобы при получениив ответ он должен войти в фоновый блок appdelegate и viewcntroller.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Я бы связал ответ от метода.Когда моему делегату приложения понадобятся данные, пусть ваш контроллер представления продолжит ответ.В приведенном ниже примере параметр success объединен в цепочку, чтобы обеспечить повторные попытки.Но вы можете передать целые ответы с помощью этого шаблона параметров блока.

func pull(data: @escaping ((_ response: String, _ success: Bool) -> Void)) {
  let code = arc4random_uniform(2) == 0 ? true : false
  let response = (code ? "pulled some data" : "incomplete data")
  data(response, code)
}


func someButtonTapped(needsRecall: ((_ outerSuccess: Bool) -> Void)?) {
  pull { (response, success) in
    if let checkRecall = needsRecall { checkRecall(!success) }
    if success {
      print(response)
    } else {
      print("failed to pull data")
    }
  }
}

someButtonTapped { (needsRecall) in
  if needsRecall {
    someButtonTapped(needsRecall: nil)
  } else {
    print("success")
  }
}
0 голосов
/ 07 июня 2018

Это не очень хорошая идея, но, как вы настаиваете, пожалуйста, следуйте следующему коду.

Вы можете добавлять блоки в whereToPassData и всякий раз, когда вы получаете ответ, уведомлять всех.

import Foundation
import UIKit

public class AppGlobalManager:NSObject {
    static let sharedManager = AppGlobalManager()

    private override init() {
        super.init()
        //This prevents others from using the default '()' initializer for this class.
    }

    var whereToPassData:[Register?] = []

    typealias Register  = ([AnyHashable : Any]) -> Void

    func method(_ paramter:Any, block:@escaping Register){
        //some code
        for ref in whereToPassData {
            ref?(["test":"test"])
        }
        self.whereToPassData.removeAll()
    }
}

public class yourvc :UIViewController {
    public override func viewDidLoad() {
        var block = { (test:[AnyHashable : Any]) in
        }

        AppGlobalManager.sharedManager.whereToPassData.append(block)
        AppGlobalManager.sharedManager.method(for: "test")
    }
}
...