标签: completionhandler

通过在iOS中连接表来从Firebase获取数据

我正在尝试从两个不同的Firebase表中获取数据.这是表的结构:

Post {
    1{
       pImages{
           i1:true
           i2:true
       }
    }
    2{
       pImages{
           i3:true

       }
    }
}
Images{
       i1{
          iUrl : ....
          pId : 1
         }
       i2{
          iUrl :...
          pId : 1
         }
       i3{
         iUrl:....
          pId : 2
         }
 }
Run Code Online (Sandbox Code Playgroud)

我需要检索对应于id为1的post的图像.以下是我检索图像的实现:

 func retrieveImagesForPost(postId: String,completion: (result: AnyObject?, error: NSError?)->()){
        var imgArray:[Image]=[]
        let postsRef = self.ref.child("post")
        let imagesRef = self.ref.child("image")
        let postImagesRef = postsRef.child(postId).child("pImages");
        postImagesRef.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
            for item in snapshot.children{
                imagesRef.child(item.key).observeSingleEventOfType(.Value, withBlock: { (snap) in
                    let image = Image(snapshot: snap)
                    print(image) …
Run Code Online (Sandbox Code Playgroud)

ios firebase completionhandler firebase-realtime-database

6
推荐指数
1
解决办法
1866
查看次数

FBSDKRequestConnection警告swift3

我试图解决这个警告,但没有成功.自升级到swift3后,我在Facebook Graph Request完成处理程序中收到一条警告消息.

错误消息具体是"未使用类型'FBSDKGraphRequestConnection?'的表达式."

graphRequest?.start(completionHandler: { (connection, result, error) in

            if error != nil {

                //do something with error

            } else if result != nil {

                //do something with result 
            }

        })
Run Code Online (Sandbox Code Playgroud)

我已经尝试添加(在完成处理程序中)代码行,如下所示,以查看警告是否会消失,但警告是持久的.

connection.start()

connection.timeout = 30

if connection != nil {


            }
Run Code Online (Sandbox Code Playgroud)

完成处理程序我在swift2中工作得很好,没有给我这样的警告.我没有正确使用完成处理程序吗?

connection xcode facebook-graph-api completionhandler swift3

6
推荐指数
1
解决办法
1180
查看次数

等待完成处理程序完成 - Swift

我正在尝试检查UserNotifications是否已启用,如果不是,我想要发出警报.所以我有一个checkAvailability检查多项内容的功能,包括UserNotification授权状态.

func checkAvailabilty() -> Bool {

    // 
    // other checking
    //

    var isNotificationsEnabled = false
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound], completionHandler: { (granted, error) in

                    if granted {
                        isNotificationsEnabled = true
                    }
                    else {
                        isNotificationsEnabled = false
                    }
                })
            }


    if isNotificationsEnabled {
        return true
    }
    else {
        // Throw alert: Remind user to activate notifications
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

但是完成处理程序调用太迟了.函数已经返回false,之后执行colsure中的代码.

我试图将整个语句UNUserNotificationCenter.current().requestAuthorization()放在同步调度队列中,但这不起作用.

另一种方法是从闭包内部返回,但我不知道如何实现.

closures grand-central-dispatch ios completionhandler swift

6
推荐指数
2
解决办法
8661
查看次数

How to tell what queue a completionHandler executes on?

查看文档URLSession.dataTask很明显这个函数是异步调用的,但没有提到 completionHandler 是否返回到主线程、调用它的线程或保留在执行 dataTaskOperation 的线程上。

这里有一个普遍的约定吗?

  let task = URLSession.shared().dataTask(with: request) {
        //What Thread are we on here?
    }
Run Code Online (Sandbox Code Playgroud)

asynchronous grand-central-dispatch ios completionhandler swift

6
推荐指数
1
解决办法
685
查看次数

如何使用CompletionHandlers和小于请求的ByteBuffer读取请求?

我正在使用Java 7和AsynchronousSocketChannel。我想读取一个请求(例如HTTP POST),但是如果它大于ByteBuffer我正在使用的大小,我正在努力想出一个很好的解决方案来读取完整的请求。例如,如果ByteBuffer是4048字节,并且HTTP POST包含大于4kB的图像。

有没有很好的递归解决方案或循环呢?

这是我的阅读请求代码:

public void readRequest(final AsynchronousSocketChannel ch) {
    final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
    final StringBuilder strBuilder = new StringBuilder();
    final CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder();

    ch.read(buffer, null, new CompletionHandler<Integer, Void>() {

        public void completed(Integer bytes, Void att) {

            buffer.flip();                          
            try {
                decoder.reset();
                strBuilder.append(decoder.decode(buffer).toString());
            } catch (CharacterCodingException e) {
                e.printStackTrace();
            }           
            buffer.clear();         

            // More data to read or send response
            if(bytes != -1) {

                // More data to read
                ch.read(...); …
Run Code Online (Sandbox Code Playgroud)

java asynchronous nio bytebuffer completionhandler

5
推荐指数
1
解决办法
2854
查看次数

在目标 c 中调用 Swift 完成处理程序

我正在尝试调用一个 swift 方法,它是这样实现的:-

@objc class DataAPI: NSObject {
    func makeGet(place:NSString , completionHandler: (String! , Bool!) -> Void)
    {
        var str:String = ""
        let manager = AFHTTPSessionManager()

        manager.GET("https://api.com", parameters: nil, success:
              { (operation, responseObject) -> Void in
                        str = "JSON:  \(responseObject!.description)"
                        print(str)

                        completionHandler(str,false)   //str as response json, false as error value

            },
                    failure: { (operation,error: NSError!) in
                        str = "Error: \(error.localizedDescription)"
                        completionHandler("Error",true)   
        })

    }}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试在我的 Objective C 类中调用它时,它抛出错误“没有可见的 DataAPI 接口声明选择器 makeGet:completionHandler”

这就是我在 Objective C 类中调用方法的方式:-

[[DataAPI  new] makeGet:@"" completionHandler:^{
}];
Run Code Online (Sandbox Code Playgroud)

xcode objective-c ios completionhandler swift

5
推荐指数
1
解决办法
4369
查看次数

如何使用 MVVM 登录?

我对 iOS 开发还是很陌生,我正在尝试从 MVVM 开始在 Swift 中自学良好的编码实践和设计模式。我需要将数据从我的 ServiceCall 类中的完成句柄传递到我的 ViewModel。我需要帮助以了解我如何做到这一点,以及在我的代码中使用 MVVM 的最佳实践指导。

这是我到目前为止所做的:

模型

struct Login {
  var appVersion: String ?
  var deviceID : String ?
  var deviceOS : String ?
  var password : String ?
  var username : String ?
}
Run Code Online (Sandbox Code Playgroud)

服务调用/API 客户端

class LoginServiceCall : NSObject, URLSessionDelegate {
  let viewResponse = ThrowResponse()
  func requestLogin(request: URLRequest, requestObject: Login, completion: @escaping ([NSDictionary] ? ) -> Void) {
    let searchParams = Login.init(appVersion: requestObject.appVersion, deviceID: requestObject.deviceID, deviceOS: requestObject.deviceOS, password: requestObject.password, username: requestObject.username) …
Run Code Online (Sandbox Code Playgroud)

dictionary nsdictionary mvvm completionhandler swift

5
推荐指数
0
解决办法
2464
查看次数

在 Android 和 Java 上复制 Swift 完成处理程序

多年后,我正在尝试使用 Firebase Firestore 开发 Android 应用程序。我基本上是在尝试复制这个 Swift 函数:

func getCategories(onCompletion completionBlock: @escaping (_ categories: [Category]?, _ error: Error?) -> Void) {

  firestore.collection("cats").getDocuments { (snap, error) in
    guard let snap = snap else {
      completionBlock(nil, error ?? anUnknownError)
      return
    }

    var categories: [Category] = []
    for document in snap.documents {
        let cat = Category.init(data: document.data())
        categories.append(cat)
    }
    completionBlock(categories, nil)
  }
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道 swift 的块的等价物是什么,甚至不知道它是否存在。

我检查了 Firebase 源代码。Query.get()返回Task<QuerySnapshot>所以我试图返回一个Task<List<Category>>没有运气。

任何帮助?谢谢你。

编辑:添加了 Android 代码以阐明我正在尝试做什么。

public class FirestoreService { …
Run Code Online (Sandbox Code Playgroud)

java android ios completionhandler google-cloud-firestore

5
推荐指数
2
解决办法
2609
查看次数

SwiftUI - 如何从视图模型调用完成函数

我有一个获取邮政编码并将其传递给方法的表单。该方法查找城市和州,并将信息作为元组返回。该方法还有一个完成处理程序,以便在找到城市和州之前不会保存其余的表单数据。

我将函数移至视图模型以保持秩序,但现在我很困惑。首先,必须在函数返回之前调用完成处理程序,尽管这似乎与我想要的完全相反。我想获取城市和州的值,然后我想通过处理程序保存它们。我困惑的后半部分是函数的调用。如果我分配一个变量,例如cityState从我的方法接收元组,则保存发生在我无法访问的闭包中!(请参阅下面的设置查看代码。)

我可以将所有内容移回正常工作的视图。但我试图了解 MVVM 应该如何工作。

设置视图模型

func getCityStateFromPostalCode(zip: String, completion: @escaping () -> ()) -> (String, String) {
   let geocoder = CLGeocoder()
   var city = ""
   var state = ""
        
   geocoder.geocodeAddressString(zip) { (placemarks, error) in
      if let placemark = placemarks?[0] {
         if placemark.postalCode == zip {
            city = placemark.locality!
            state = placemark.administrativeArea!
         }
      }
      completion()
   }
   return (city, state)
} 
Run Code Online (Sandbox Code Playgroud)

设置视图

let settingsVM = SettingsViewModel()

let cityState = settingsVM.getCityStateFromPostalCode(zip: companyZip) {
   let newCompany = Company(context: self.moc) …
Run Code Online (Sandbox Code Playgroud)

viewmodel completionhandler swift swiftui

5
推荐指数
1
解决办法
3134
查看次数

转义闭包捕获非转义参数“完成”(Swift 5)

在我的项目中,我遇到了一种情况,当我需要使用后台队列来创建 AVPlayerItem (我在setupTrackModels函数中创建)时。我想在getTracks函数中执行此操作,并且此方法还必须有一个完成处理程序,我需要在主线程中调用它,但我无法以任何方式使它们成为朋友。我收到编译器错误:Escaping closure captures non-escaping parameter 'completion'也许有人可以告诉我如何执行此操作或显示另一种方法。

我想做这样的事情:

var content: [URL] = []
var tracks: [TrackModelProtocol] = []

private func getTracks(completion: () -> ()) {
    DispatchQueue.global(qos: .background).async { //Error: Escaping closure captures non-escaping parameter 'completion'
        self.tracks = self.setupTrackModels(content: self.content)
        
        DispatchQueue.main.async { //Error: Escaping closure captures non-escaping parameter 'completion'
            completion()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我想使用这样的函数:

getTracks {
   tableView.reloadData()
   //or something else
}
Run Code Online (Sandbox Code Playgroud)

我不想tableView.reloadData()在 DispatchQueue.main 中使用。getTracks块,因为我多次调用并且我想在它的完成块中实现不同的逻辑

grand-central-dispatch ios completionhandler swift

5
推荐指数
1
解决办法
4236
查看次数