2016-05-14 121 views
3

我在做什么错?在此先感谢您的帮助!!为什么我会收到UnsafeMutablePointer错误?

我写了下面的代码,目的是控制对我的数据库的请求,还有一个外部网站,我试图解析其数据,以便填充我的数据库。目标是生成1000多个请求,将它们放在堆栈上,然后限制在给定时间内同时发送多少个请求。它工作得很好,但每隔一段时间,它此行的代码生成异常:

RequestManager.requests .append(!_request)

这行代码是Push功能WebRequestManager。你可以看到下面的代码。

致命错误:UnsafeMutablePointer.destroy负计数

一个例子请求如下所示:

WebRequestManager.Request(WebRequest(_data: self.beerstores, _url: "http://brewskibooze.com/beerstore/build_database/postbeerstoreproductavailability.php"), 
            completion: { 
             (data,response,error) in 
             if error == nil 
             { 
              self.display(_string: "Process Complete") 
             } 
             else 
             { 
              self.display(_string: "Unable to post inventory.") 
             } 


            }) 

下面的代码:

class WebRequest 

{

private var trials = 0 

private var executed = false 

private var data : AnyObject? 

private var url : String? 

private var completion : ((data: NSData?, response: NSURLResponse?, error : ErrorType?) -> Void)? 

private func execute() 
{ 
    if !executed 
    { 
     trials += 1 
     self.executed = true 
     let endpoint = NSURL(string: url!) 

     if (endpoint == nil) { return } 

     let request = NSMutableURLRequest(URL: endpoint!) 

     if data != nil 
     { 
      if data is NSData 
      { 
       request.HTTPMethod = "POST" 
       request.HTTPBody = data as? NSData 
      } 
      else 
      { 
       request.HTTPMethod = "POST" 
       request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(data!, options: []) 
      } 
     } 
     request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
     { 
      data, response, error in 

      if error == nil 
      { 

       WebRequestManager.pop() 

       self.completion?(data: data,response: response,error: error) 
      } 
      else 
      { 
       if self.trials < 10 
       { 
        self.executed = false 
        self.execute() 
       } 
       else 
       { 
        WebRequestManager.pop() 
        self.completion?(data: data,response: response,error: error) 
       } 
      } 
     } 
     task.resume() 
    } 
} 

init(_query : Query?) 
{ 

    data = _query!.data 

    url = _query!.toString() 
} 

init(_data : AnyObject?, _url : String) 
{ 

    data = _data 

    url = _url 
} 

init(_data : NSData?, _url : String) 
{ 
    data = _data 
    url = _url 
} 

deinit 
{ 
    completion = nil 
    data = nil 
    url = nil 
} 

}

class WebRequestManager 

{

private var requests : [WebRequest]? 
private static var MaxConcurrentRequests = 10 

private var currentRequestCount = 0 

private static var RequestManager = WebRequestManager() 

private class var RequestCount : Int 
{ 
    return RequestManager.currentRequestCount 
} 

private class func DecrementCount() 
{ 
    RequestManager.currentRequestCount -= 1 
} 

private class func IncrementCount() 
{ 
    RequestManager.currentRequestCount += 1 
} 

private class func push(_request : WebRequest?) 
{ 
    if _request != nil 
    { 
     IncrementCount() 
     RequestManager.requests?.append(_request!) 
    } 

} 

private class func pop() 
{ 
    if RequestManager.requests?.count > 0 
    { 
     let last : WebRequest? = RequestManager.requests?.removeLast() 
     if last != nil 
     { 
      last!.execute() 
      DecrementCount() 
     } 
    } 
} 

init() 
{ 
    requests = [WebRequest]() 
} 

class var ActiveThreadCount : Int 
{ 
    return RequestManager.currentRequestCount 
} 


class func Request(_request : WebRequest?,completion : ((data: NSData?, response: NSURLResponse?, error : ErrorType?) -> Void)?) 
{ 
    _request?.completion = completion 
    if RequestCount < MaxConcurrentRequests 
    { 
     _request?.execute() 
    } 
    push(_request) 
} 

}

+0

这行做了Debuger停止?而你的代码太长了...... – Lumialxk

+0

对不起,关于长码。我试图彻底描述这个问题。它在WebRequestManager RequestManager.requests?.append(_request!)的push()函数中退出 – bhardy

+0

有多个请求涉及推送和弹出,我会发现自己处于同时弹出和推送的位置,这可能吗?我将如何解决这个问题? – bhardy

回答

0

我敢肯定,我刚才已经回答我的问题。问题在于,在线程环境中,所有这些请求以及许多请求和弹出请求都会导致同时弹出和推送的风险。该解决方案似乎是这样的:

objc_sync_enter(锁定)

objc_sync_exit(锁定)

信贷由于在这里:​​

Create thread safe array in swift

但是,导致此警告...

| synchronize-skip |在快照块内启动了一个栅栏 - 跳过了工作空间同步,因为它可能会使fenceExemptQueue中的消息出列,并且快照预计不会发生 2016-05-14 14:11:57.791 _____ [348:99565] | synchronize -skip |篱笆开始快照块内 - 跳过工作区同步,因为它可能离队从fenceExemptQueue信息和快照预计不会发生

0

您指出我在正确的方向,串行调度队列解决了我的问题没有警告。

创建快捷3串行调度队列:

let serialQueue = DispatchQueue(label: "myqueue")` 

然后修改数组中的队列:

serialQueue.sync { 
     //modify array 
    } 
相关问题