2016-10-17 11 views
2

Мое приложение отображает плитки OpenStreetMap (256 * 256 изображений) и кэширует их на диске, пока пользователь просматривает карту.Триггеры NSData.write ECX_BAD_ACCESS на iOS 8

На iOS 10 все в порядке, но на iOS 8 приложение вылетает (EXC_BAD_ACCESS), если я не пишу NSData атомарно. Нет никаких проблем, чтобы сделать это атомарно, но я хотел бы понять, что происходит.

Вот соответствующий код, я использую:

private func putInCache(key:NSString, data:NSData) { 

    // Get the path: 
    let path:String = "\(self.imagesFolderPath)/\(key)"; 
    var success:Bool = false; 

    // Save the image, if it does not exists: 
    if(!FileManager.default.fileExists(atPath:path)) { 

     // Run in background: 
     DispatchQueue.global().async { 

      // Put the image in the memory cache: 
      self.memoryCache.setObject(data, forKey:key); 

      // Insert the row in the database: 
      let success = insertDataInDb(...); 

      // Then save the file (if the DB insertion succeeded): 
      if(success) { 

       data.write(toFile:path, atomically:false); // If I set atomically to true, it works. 
      } 
     } 
    } 
} 

ли кому-то знает, почему существует разница между записью данных атомарно или нет?

ответ

0

яблочная документации (https://developer.apple.com/reference/foundation/nsdata):

Atomic пишет гарантию того, что данные либо сохраненное во всей ее полноте, или она не полностью. Атомная запись начинается с записи данных в временным файлом. Если эта запись завершается успешно, тогда метод перемещает временный файл в его окончательное местоположение.

Возможно, вы столкнулись с крахом из-за одновременных попыток записи на один и тот же путь разными очередями.