我想实现AlamofireObjectMapper(https://github.com/tristanhimmelman/AlamofireObjectMapper)与Alamofire 3和ObjectMapper(最新版本https://github.com/Hearst-DD/ObjectMapper).
似乎AlamofireObjectMapper没有更新与Alamofire 3合作,所以我试图自己做.
我来到这段代码,现在我被卡住了.
似乎通用类型T在响应的完成块内是不可访问的.是Alamofire3改变还是Swift 2.1改变?
这是错误:
无法转换'T?'类型的值 预期的参数类型'_?'
public func responseObject<T: Mappable>(queue: dispatch_queue_t?, keyPath: String?, completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, AnyObject?, ErrorType?) -> Void) -> Self {
return response(queue: queue) { (request, response, data, error) -> Void in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
let result = JSONResponseSerializer.serializeResponse(request, response, data, error)
let parsedObject = Mapper<T>().map(keyPath != nil ? result.value?[keyPath!] : result.value)
dispatch_async(queue ?? dispatch_get_main_queue()) {
completionHandler(self.request!, self.response, …Run Code Online (Sandbox Code Playgroud) 无法理解Crashlytics中的崩溃报告.
这是崩溃日志:
Crashed: com.apple.main-thread
0 Rekindlr 0x10007a728 ViewController.(user_info(Match?, completionHandler : (Bool?) -> ()) -> ()).(closure #1) (ViewController.swift:201)
1 Alamofire 0x100156678 partial apply for thunk (ResponseSerialization.swift)
2 Alamofire 0x10015891c specialized Request.(response<A where ...> (queue : OS_dispatch_queue?, responseSerializer : A, completionHandler : (Response<A.SerializedObject, A.ErrorObject>) -> ()) -> Self).(closure #1).(closure #1) (ResponseSerialization.swift:131)
3 libdispatch.dylib 0x1827614bc _dispatch_call_block_and_release + 24
4 libdispatch.dylib 0x18276147c _dispatch_client_callout + 16
5 libdispatch.dylib 0x182766b84 _dispatch_main_queue_callback_4CF + 1844
6 CoreFoundation 0x182cccdd8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
7 CoreFoundation 0x182ccac40 __CFRunLoopRun + 1628
8 …Run Code Online (Sandbox Code Playgroud) 我有一个方法调用三个函数,每个函数向Firebase发出请求并在完成处理程序中传回数据.一旦完成了来自2个完成处理程序的数据,我就会调用另一个方法传入数据并发回有效结果.像这样的嵌套块是设计不佳的标志吗?
func fetchNearbyUsers(for user: User, completionHandler: usersCompletionHandler?) {
self.fetchAllUsers(completionHandler: { (users: [User]) in
ChatProvider.sharedInstance.fetchAllChatrooms(completionHandler: { (chatrooms: [Chatroom]) in
self.validateNewUsers(currentUser: user, users: users, chatrooms: chatrooms, completionHandler: { (validUsers: [User]) in
guard validUsers.isEmpty == false else {
completionHandler?([])
return
}
completionHandler?(validUsers)
})
})
})
}
Run Code Online (Sandbox Code Playgroud)
//其他方法
func fetchAllUsers(completionHandler: usersCompletionHandler?) {
var users: [User] = []
let group = DispatchGroup()
let serialQueue = DispatchQueue(label: "serialQueue")
DatabaseProvider.sharedInstance.usersDatabaseReference.observe(.value, with: {
snapshot in
guard let data = snapshot.value as? [String: AnyObject] else { return }
for …Run Code Online (Sandbox Code Playgroud) 我具有以下功能,可以在我的SeachVC(UIViewController)中下载JSON数据,它可以完美运行。
func downloadJSON(){
guard let url = URL(string: "myURL") else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
let downloadedCurrencies = try JSONDecoder().decode([Currency].self, from: data)
// Adding downloaded data into Local Array
Currencies = downloadedCurrencies
} catch let jsonErr {
print("Here! Error serializing json", jsonErr)
}
}.resume()
}
Run Code Online (Sandbox Code Playgroud)
为了实现后台应用刷新,我在App Delegate中添加了以下功能;
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point …Run Code Online (Sandbox Code Playgroud) 我正在尝试为数组中的每个元素协调几个完成处理程序.
代码基本上是这样的:
var results = [String:Int]()
func requestData(for identifiers: [String])
{
identifiers.forEach
{ identifier in
service.request(identifier, completion: { (result) in
result[identifier] = result
})
}
// Execute after all the completion handlers finish
print(result)
}
Run Code Online (Sandbox Code Playgroud)
因此,Array中的每个元素都通过带有完成处理程序的服务发送,并且所有结果都存储在一个数组中.完成所有这些处理程序后,我希望执行一些代码.
我试图这样做 DispatchQueue
var results = [String:Int]()
func requestData(for identifiers: [String])
{
let queue = DispatchQueue.init(label: "queue")
identifiers.forEach
{ identifier in
service.request(identifier, completion: { (result) in
queue.sync
{
result[identifier] = result
}
})
}
// Execute after all the completion handlers finish
queue.sync
{
print(result) …Run Code Online (Sandbox Code Playgroud) 我试图在单身辅助班中处理"谷歌登录".
我有LoginHelper,以及一个用完成处理程序处理登录的方法.如您所知,Google Sign有委托方法.调用委托方法时,我需要通知我的完成处理程序.我不确定,有可能吗?
让我们一起集思广益,或者帮助我.
我的方法如下;
@objc func googleLoginPressed(viewController:UIViewController, isLoginSuccessfull:(Bool) -> ())
{
GIDSignIn.sharedInstance().signIn()
}
Run Code Online (Sandbox Code Playgroud) 我试过这个,但我不知道如何在 SwiftUI 视图中使用结果:
func getProfilePicture(_ completion: @escaping ((UIImage) -> Void)) {
Alamofire.request(GIDSignIn.sharedInstance()?.currentUser.profile.imageURL(withDimension: 75) ?? "https://httpbin.org/image/png").responseImage { response in
if let image = response.result.value {
completion(image)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果你能帮忙,我想把完成处理程序返回的图像放在这个视图中:
struct ProfileView: View {
let profileInfo = ProfileInfo()
var placeHolderImage = Image(systemName: "person")
var body: some View {
Group {
placeHolderImage
.clipShape(Circle())
.overlay(
Circle().stroke(Color.white, lineWidth: 4))
.shadow(radius: 10)
.padding(10)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望它返回一个 UIImage 以便我最终可以在 SwiftUI 视图中使用它。我已经尝试使用带有 @escaping 完成处理程序的方法,但我不知道如何使用它来解决问题。谢谢!
// wc here is an NSWindowController
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.5f];
if (duplication) {
NSPoint origin = initialSize.origin;
origin.y += initialSize.size.height;
origin = [wc.window cascadeTopLeftFromPoint:origin];
origin.y -= initialSize.size.height;
//[[wc.window animator] setFrameOrigin:origin]; // Why setFrameOrigin and cascadeTopLeftFromPoint are not animated?
initialSize.origin = origin;
[[wc.window animator] setFrame:initialSize display:YES];
}
// This block should be invoked when all of the animations started above have completed or been cancelled.
// For not to show the edit window till the duplication animation not finished
[NSAnimationContext …Run Code Online (Sandbox Code Playgroud) 我有一个提供图像资源位置的 URL 列表。我设法找到了解决方案,但我觉得似乎有比下面代码中显示的过程更好的方法。非常感谢有关如何改进此方法以异步检索图像的任何提示!
在我附加每个项目之后调用completionHandler,并在异步块之外将1添加到索引(i),这意味着while循环在最后一个url被完全处理之前迭代到下一个url项目,这不是很奇怪吗?
typealias imagesHandler = (_ images: [UIImage]) -> Void
func fetchImages(forUser user: User, completionHandler: imagesHandler?) {
var images = [UIImage]()
self.fetchImageUrlList(forUser: user) { (urlList: [URL]) in
var i = 0
while i <= urlList.count - 1 {
let request = URLRequest(url: urlList[i])
let dataTask = URLSession(configuration: .default).dataTask(with: request, completionHandler: {
(data: Data?, response: URLResponse?, error: Error?) in
guard error == nil else { return }
guard let data = data else { return }
guard let image …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何判断动画何时完成:
self.mapView.setRegion(MKCoordinateRegionForMapRect(mapRect), animated: true)
它看起来setRegion不像其他命令那样支持完成处理程序。
我知道如何使用这样的方法创建一个通用的完成处理程序: 如何在 Swift 中创建一个带有完成处理程序的函数?
但我不知道要检查什么变量来验证动画是否已完成。
swift ×9
ios ×3
alamofire ×2
asynchronous ×2
animation ×1
appdelegate ×1
concurrency ×1
delegates ×1
generics ×1
loops ×1
objective-c ×1
oop ×1
swift2 ×1
swift5 ×1
swiftui ×1
while-loop ×1