2016-10-20 23 views
5

benim app bir ActivityIndicatorView görüntülemek istediğiniz, ama ana akıştan sync yöntemi, hata ile uygulama çöker çağırdığınızda: Ben xcode 8.0 kullanıyorum exc_bad_instruction (code=exc_i386_invop subcode=0x0) ve hızlı 3DispatchQueue.main.sync dönen exc_bad_instruction Swift 3

Birisi bana yardım edebilir mi? Burada yapmaya çalıştığımız şey

func POST(endpoint:NSString!,body:NSString!,vc:UIViewController? = nil)->NetworkResult{ 
    let result = NetworkResult() 
    DispatchQueue.main.sync { 
     self.displayActivityIndicator(viewController: vc) 
    } 
    let urlStr = self.url.appending(endpoint as String).appending(self.getHashAutenticacao() as String) 
    print(urlStr) 
    let request = NSMutableURLRequest(url: URL(string: urlStr)!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 20) 
    print(request.debugDescription) 
    request.setValue("application/json", forHTTPHeaderField: "Accept") 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.httpMethod = "POST" 
    request.httpBody = body.data(using: String.Encoding.utf8.rawValue, allowLossyConversion: true) 

    // send the request 
    var data: NSData! 
    do { 
     data = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning: &self.response) as NSData! 
    } catch let error1 as NSError { 
     self.error = error1 
     data = nil 
    } 
    if let httpResponse = self.response as? HTTPURLResponse { 
     result.resultCode = httpResponse.statusCode 

     if httpResponse.statusCode == 200{ 
      if data != nil{ 
       if data.length > 0{ 
        let json = (try! JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers)) 
        if let jsonArray:NSArray = json as? NSArray{ 
         result.data = jsonArray 
        }else{ 
         if let jsonDict:NSDictionary = json as? NSDictionary{ 
          result.data = [jsonDict] 
         } 
        } 
       } 
      } 
     } 
    }else { 
     result.message = self.error!.debugDescription as NSString? 
    } 

    DispatchQueue.main.sync { 
     self.hideActivityIndicator(viewController: vc) 
    } 
    return result 
} 
+0

nedir '-displayActivityIndicator (_ :) yöntemi' yapıyor? – holex

+0

** Verileri bir sunucuya eşzamanlı olarak yüklemeyin, kötü kullanıcı deneyimine neden olur. Eşzamansız desene alışın. – vadian

+0

Ben de bunu fark ettim, ana ya da ikincil ipekten dönebilecek bir metodum var (muhtemelen bu iyi bir fikir değil ama benim durumum için anlam ifade ediyor). Yeni bir şey düşünüyorum çünkü ana iş parçacığı ana iş parçacığını şu ana kadar göndermekten asla endişelenmem. –

cevap

14

Çıkan önce bir arka plan iplik ana iş parçacığı eşzamanlı başlatmaktır. Bu mantıksal bir hatadır.

Sen böyle yapmak gerekir:

DispatchQueue.global().async(execute: { 
    print("teste") 
    DispatchQueue.main.sync{ 
     print("main thread") 
    } 
}) 
+0

sadece bir testti, tüm yöntemi güncelliyorum. –

+0

@RodrigoCosta 'DispatchQueue.main.sync { self.displayActivityIndicator (viewController: vc) } 'ile ne elde etmeye çalışıyorsunuz?'? –

+0

POST yönteminin, arayana veriyi geri göndermesi gerekir, yöntem displayActivityIndicator, bir UIActivityIndicatorView öğesini vc.view biçiminde görüntüler. Async kullanamıyorum çünkü yazıdan döndürülen verilere ihtiyacım var. –