2

I am new iOS development, I got this error from firebase crash analytics. Can anyone help me why this errors occurs?

Crashed: com.apple.main-thread
0  People Time Tracking           0x100c5009c closure #1 in closure #1 in SelectJobScreen.getPreviousStatus() (SelectJobScreen.swift:798)
1  People Time Tracking           0x100cb2648 thunk for @escaping @callee_guaranteed () -> () (<compiler-generated>)
2  libdispatch.dylib              0x1e6993a38 _dispatch_call_block_and_release + 24
3  libdispatch.dylib              0x1e69947d4 _dispatch_client_callout + 16
4  libdispatch.dylib              0x1e6942004 _dispatch_main_queue_callback_4CF$VARIANT$mp + 1068
5  CoreFoundation                 0x1e6ee4ec0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
6  CoreFoundation                 0x1e6edfdf8 __CFRunLoopRun + 1924
7  CoreFoundation                 0x1e6edf354 CFRunLoopRunSpecific + 436
8  GraphicsServices               0x1e90df79c GSEventRunModal + 104
9  UIKitCore                      0x212cc5b68 UIApplicationMain + 212
10 People Time Tracking           0x100c1afcc main (TodoItem.swift:17)
11 libdyld.dylib                  0x1e69a58e0 start + 4

I've tried figuring out what could cause this crash for a few days now, and haven't been able to reproduce it. I don't see any implicit unwraps or optionals here, but sessionId is a non-optional value in the session object if that matters.

I am using swift 4.1, and the crashes occur on on iOS devices running all the different flavours of iOS 10, 11, and 12. The app does support some builds of iOS 9, but none have been reported (although that may be irrelevant because the iOS 9 user base for the app is extremely small)

In Error log it's showing this function getPreviousStatus()

func getPreviousStatus() {
    let connect = JsonManger()
    let app = UIApplication.shared.delegate as! AppDelegate
    let user:User  = app.dataManager.gUser

    if Reachability.isConnectedToNetwork() {
        self.showHUD( msg: "Loading...." )
        connect.getLogDetails(baseUrl: user.ClientWeb, email: user.EmailID, password: user.Password, brugerId: user.BrugerID, success: { (res) in
            var indud = false
            if ( res.object(forKey: "indud") != nil ){
                indud = res.object(forKey: "indud") as! Bool
            }

            if indud {
                var isTodo = false
                if res.object(forKey: "isToDo") != nil {
                    isTodo = res.object(forKey: "isToDo") as! Bool
                }

                if isTodo {
                    var str = res.object(forKey: "JobId") as! String
                    let index = str.index(str.startIndex, offsetBy: 1)
                    str = str.substring(from: index)
                    let prjId = Int(str)!
                    let project = app.dataManager.gProject.getProject(id: prjId)
                    let todoId  = res.object(forKey: "TodoId") as! String
                    let todo = app.dataManager.gTodo.getTodo(id: Int(todoId)!)

                    self.project = project
                    self.todoItem = todo
                    app.dataManager.isCheckedin = true
                    self.des = res.object(forKey: "JobDescription") as? String
                    let  startTime  = res.object(forKey: "Dato2") as! String
                    DispatchQueue.main.async {

                        let ud  = UserDefaults.standard
                        ud.set(true, forKey: "isCheckedIn")
                        ud.set( 1, forKey:"type")
                        ud.set( self.project.ID!, forKey: "projectId" )
                        ud.set( self.todoItem.ID! , forKey: "todoId" )
                        // print(" todo data  is : \(self.todoItem.ID!)")
                        ud.set( self.des, forKey: "des")
                        ud.set( startTime,forKey: "startTime")
                        ud.set( startTime, forKey: "checkInTime" )
                        ud.synchronize()

                        self.hideHUD()
                        self.performSegue(withIdentifier: "goStartTodoFromSelect", sender: nil )
                    }

                } else {
                    var jobId  = res.object(forKey: "JobId") as! String
                    jobId = jobId.replacingOccurrences(of: "P", with: "")
                    self.des = res.object(forKey: "JobDescription") as? String
                    let jobCode  = app.dataManager.gJobCode.getJobCode(id: Int(jobId)! )
                    self.jobCodeItem = jobCode
                    // let chekinTime = res.object(forKey: "Dato2") as! String
                    let  startTime  = "2019-05-15T19:45:00"

                    DispatchQueue.main.async {
                        app.dataManager.isCheckedin = true

                        let ud  = UserDefaults.standard
                        ud.set(true, forKey: "isCheckedIn")
                        ud.set( 0, forKey:"type")
                        ud.set( jobId, forKey: "jobId" )
                        ud.set( startTime,forKey: "startTime")
                        ud.set( startTime, forKey: "checkInTime" )

                        if res.object(forKey: "JobDescription") != nil {
                            self.des = res.object(forKey: "JobDescription") as? String
                            ud.set( self.des, forKey: "des")
                        }
                        ud.synchronize()

                        DispatchQueue.main.async {
                            self.hideHUD()
                            self.performSegue(withIdentifier: "goStartJob", sender: nil )
                        }
                    }
                }

            } else {
                DispatchQueue.main.async {
                    self.hideHUD()
                    //            self.popToRoot()
                    for controller in self.navigationController!.viewControllers as Array {
                        if controller.isKind(of: SelectJobScreen.self) {
                            self.navigationController!.popToViewController(controller, animated: true)
                            break
                        }
                    }
                }
            }
        }) { (error) in
            DispatchQueue.main.async {
                self.hideHUD()
                //            self.popToRoot()
                for controller in self.navigationController!.viewControllers as Array {
                    if controller.isKind(of: SelectJobScreen.self) {
                        self.navigationController!.popToViewController(controller, animated: true)
                        break
                    }
                }
            }
        }
    } else {
        print("Record Not Found")
    }
}
Sagar Chauhan
  • 5,715
  • 2
  • 22
  • 56
user11211835
  • 164
  • 2
  • 16

1 Answers1

1

Inside of that getPreviousStatus() functions getting null values , check it once using debugging

   DispatchQueue.main.async {
                      # mainly in this thread getting error check it once
                        let ud  = UserDefaults.standard
                        ud.set(true, forKey: "isCheckedIn")
                        ud.set( 1, forKey:"type")
                        ud.set( self.project.ID!, forKey: "projectId" )
                        ud.set( self.todoItem.ID! , forKey: "todoId" )
                        // print(" todo data  is : \(self.todoItem.ID!)")
                        ud.set( self.des, forKey: "des")
                        ud.set( startTime,forKey: "startTime")
                        ud.set( startTime, forKey: "checkInTime" )
                        ud.synchronize()

                        self.hideHUD()
                        self.performSegue(withIdentifier: "goStartTodoFromSelect", sender: nil )
                    }
Narasimham
  • 182
  • 1
  • 10