我正在尝试从两个不同的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) 我试图解决这个警告,但没有成功.自升级到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
我正在尝试检查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()放在同步调度队列中,但这不起作用.
另一种方法是从闭包内部返回,但我不知道如何实现.
查看文档,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
我正在使用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) 我正在尝试调用一个 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) 我对 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) 多年后,我正在尝试使用 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) 我有一个获取邮政编码并将其传递给方法的表单。该方法查找城市和州,并将信息作为元组返回。该方法还有一个完成处理程序,以便在找到城市和州之前不会保存其余的表单数据。
我将函数移至视图模型以保持秩序,但现在我很困惑。首先,必须在函数返回之前调用完成处理程序,尽管这似乎与我想要的完全相反。我想获取城市和州的值,然后我想通过处理程序保存它们。我困惑的后半部分是函数的调用。如果我分配一个变量,例如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) 在我的项目中,我遇到了一种情况,当我需要使用后台队列来创建 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块,因为我多次调用并且我想在它的完成块中实现不同的逻辑
ios ×6
swift ×6
asynchronous ×2
java ×2
xcode ×2
android ×1
bytebuffer ×1
closures ×1
connection ×1
dictionary ×1
firebase ×1
mvvm ×1
nio ×1
nsdictionary ×1
objective-c ×1
swift3 ×1
swiftui ×1
viewmodel ×1